题目和实现方法
//1.判断一个数是否是质数 如果是质数,函数的返回值为1, 否则为0
int isPrimeNumber(int num){
if(num == 1) return 0;
if(num == 2) return 1;
for (int i=2; i < num; i++) {
if (num % i == 0) {
return 0;
}
}
return 1;
}
//2. 编写一个函数,输入两个正整数, 输出最大公约数 和 最小公倍数
// GCD Greatest Common Divisor LCM Lowest Common Multiple
void printGCDAndLCM(int a, int b) {
//最大公约数
int min = a < b ? a : b;
int gcd = 1;
for (int i = 1; i < min; i ++) {
if (a % i == 0 && b % i == 0) {
gcd = i;
}
}
printf("\n(%d,%d)最大公约数gcd:%d\n",a,b,gcd);
//最小公倍数
int max = a > b ? a : b;
int lcm = 1;
for(int i=1 ; i <= max ; i++){
if ((i * min) % max == 0) {
lcm = i * min;
break;
}
}
printf("(%d,%d)最小公倍数lcm:%d\n",a,b,lcm);
}
//3.一张一元纸币兑换成一分,二分和五分的硬币,假定每种至少一枚,编程序计算共有多少种兑换方法并打印各种兑换方法.
void calcuExchange(){
// 100 = 1 + 2 + 5 + ?
//int a[10]={ 0,1,2,3,4,5,6,7,8,9 };
int money[3] = {1,2,5};
int exchangeMoney = 100 - 1 - 2 - 5;
int no1 = exchangeMoney / money[0];
int no2 = exchangeMoney / money[1];
int no5 = exchangeMoney / money[2];
for (int i = 0; i <= no1; i ++)
for(int j = 0 ;j <= no2; j++)
for(int k = 0; k<= no5;k++){
if (exchangeMoney == (i * money[0] + j * money[1] + k * money[2])) {
printf("100 = %d * %d + %d * %d + %d * %d\n",money[0],i+1,money[1],j+1,money[2],k+1);
}
}
}
//4.编写一个函数,在屏幕上打印金字塔
void printPyramid(int line){
for (int i = 0; i < line; i++) {
//打印空格
for (int j=0; j < line - i - 1; j++) {
printf(" ");
}
//打印#
for (int k=0; k < 2*i+1; k++) {
printf("#");
}
//换行
printf("\n");
}
}
//5 一个正整数有可能可以被表示为n(n>2)个连续正整数之和, 如
/*
15 = 1 + 2 + 3 + 4 + 5
15 = 4 + 5 + 6
15 = 7 + 8
编写程序,根据输入的正整数,输出符合这种要求的所有连续正整数序列.
*/
void printPositiveSequence(int num){
int flag = 0;
for (int i = 1; i <= num/2 ; i++) {
int tmp = 0;
//最大要尝试到num/2 + 1
for (int j = i; j <= num/2 + 1; j++) {
tmp = tmp + j;
if (tmp > num) {// 大于跳出内层循环
break;
}else if (tmp == num){//找到了
flag =1;
printf("%d = ",num);//前端
for (int k = i; k <= j ; k++) {
if (k == i) { //第一部分
printf("%d",k);
}else{
//后面
printf(" + %d",k);
}
}
printf("\n");
}
}
}
if (flag == 0) {
printf("%d : none\n" ,num);
}
}
//6.将一个正整数分解质因数, 例如 输入 90 打印出 90 = 2 * 3 * 3 * 5
//me
void decomposePrimFactor(int num){
int tmp = num;
int flag = 0;
for (int i = 2; i <= num/2; i++ ) {
if (isPrimeNumber(i)) {
while (tmp % i == 0) {
if (flag ==0) {
printf("\n%d = %d ",num,i);
flag = 1;
}else{
printf("* %d ",i);
}
tmp = tmp / i;
}
}
}
if (flag == 0) {
printf("%d 不能分解质因数",num);
}
}
//更好的答案
void decomposePrimFactor2(int n){
int i;
printf("%d=",n);
//从2开始到n
for(i=2;i<=n;i++)
{
//找到可以除的数
while(n%i==0)
{
printf("%d",i);
n/=i;
if(n!=1) printf("*");
}
}
}
//7. 打印出杨慧三角形(要求打印出10行如下图)
void printTriangle(int num){
int a[num][num];
for (int i = 0; i < num; i++) {
//打印空格
for (int j = 0 ; j < num - i; j++) {
printf(" ");
}
//打印每行数字
for (int k = 0; k <= i; k++) {
if (k == 0 || k == i ) {
a[i][k] = 1;
}else{
a[i][k] = a[i-1][k] + a[i-1][k-1];
}
printf(" %3d",a[i][k]);
}
printf("\n");
}
}
//8. 有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下来的是原来第几号的那位;
void theLastOneNo(int num){
//二维数组
int n[2][num];
//留下的人数
int m = num;
//二维数字, 第一行标示这个是否出局,0表示还在,1出局. 第二行表示人的编号
for (int i = 1; i <= num; i++) {
n[0][i-1] = 0;
n[1][i-1] = i;
}
//j表示实际指向的人的编号, k表示报的的数(1到3),
int j = 0, k = 0;
//留下的人数大于
while (m > 1) {
j = j + 1;
//j超过最大人数回到初始位置
if (j > num) {
j = 1;
}
//指向的人没出局,增加有效报数
if (n[0][j-1] == 0) {
k++;
}
//当到达有效报数,标记当前位置的人出局,减少留下来的人,重置报数
if (k == 3) {
n[0][j - 1] = 1;
m--;
k = 0; //重置`
}
}
//打印留下来的人
for (int i = 0; i < num; i++) {
if (n[0][i] == 0) {
printf("\n-%d个人游戏,最后一个人是:%d号",num,n[1][i]);
}
}
}
- (void)theLastOneNo:(NSInteger)num{
NSMutableArray *array = [NSMutableArray arrayWithCapacity:num];
for (int i = 0; i < num; i++) {
array[i] = @(i+1);
}
int n = 1, m = 0;
do {
if (n % 3 == 0 ) {
[array removeObjectAtIndex:m];
m--;
}
n++;
m++;
m = m == array.count ? 0 : m;
} while (array.count>1);
NSLog(@"\n%ld个人游戏,最后一个人是:%@号",(long)num,array.lastObject);
}
//9.乒乓球比赛
void printGamelist(){
char i,j,k; /*i是a的对手;j是b的对手;k是c的对手*/
for (i='x';i<='z';i++)
for (j='x';j<='z';j++)
if (i!=j)
for (k='x';k<='z';k++)
if (i!=k && j!=k)
if (i!='x' && k!='x' && k!='z')
printf("A--%c , B--%c ,C--%c\n",i,j,k);
}
测试
//1
for (int i = 1; i < 100; i++) {
if (isPrimeNumber(i) == 1) {
printf("%d ",i);
}
}
//2
printGCDAndLCM(10, 15) ;
//3
calcuExchange();
//4
printPyramid(8);
//5
printPositiveSequence(15);
//6
decomposePrimFactor(90);
decomposePrimFactor2(11);
//7
printTriangle(10);
for (int i = 1; i < 10; i ++) {
//8
//[self theLastOneNo:i];
theLastOneNo(i);
}
//9
printGamelist();
结果
-
-
-
...
-
-
-
-
-
-