问题求解与程序设计作业2

1【找规律】编程求出序列的后面指定的n个数。

1, 2, 4, 7, 8, 11, 14, 16, 17, 19, 22, 26, 28, 29, 41, 44, ?

[cpp]  view plain  copy
  1. /*【找规律】编程求出序列的后面指定的n个数。 
  2. **1, 2, 4, 7, 8, 11, 14, 16, 17, 19, 22, 26, 28, 29, 41, 44, ? 
  3. ×规律是不能是3 5 的倍数,以及不能含有3 或 5 
  4. */  
  5. #include<stdio.h>  
  6. int main()  
  7. {  
  8.     int n;  
  9.     printf("input n:");  
  10.     scanf("%d",&n);  
  11.     int i = 1;  
  12.     while(n > 0){  
  13.         if((i%3 != 0)&&(i%5!=0)){//初略判断  
  14.             int j = i;  
  15.             while(j){//判断其余各位是不是符合要求  
  16.                 //分别求个位十位百位。。。  
  17.                 if ((j % 10 == 3) || (j % 10 == 5)){  
  18.                     break;  
  19.                 }  
  20.                 else{  
  21.                     j /= 10;  
  22.                 }  
  23.             }  
  24.             if (j == 0){  
  25.                 printf("%d\t", i);  
  26.                 --n;  
  27.             }  
  28.         }  
  29.         ++i;  
  30.     }  
  31.   
  32.     return 0;  
  33. }  

2【读写序列】编程求出序列的下一行。
1 3
1 1 1 3
3 1 1 3
1 3 2 1 1 3
1 1 1 3 1 2 2 1 1 3
3 1 1 3 1 1 2 2 2 1 1 3
1 3 2 1 1 3 2 1 3 2 2 1 1 3
1 1 1 3 1 2 2 1 1 3 1 2 1 1 1 3 2 2 2 1 1 3
……

[cpp]  view plain  copy
  1. /* 
  2. 编程求出序列的下一行。 
  3. 1 3 
  4. 1 1 1 3 
  5. 3 1 1 3 
  6. 1 3 2 1 1 3 
  7. 1 1 1 3 1 2 2 1 1 3 
  8. 3 1 1 3 1 1 2 2 2 1 1 3 
  9. */  
  10. #include<iostream>  
  11. #include<string.h>  
  12. #define MAX 200  
  13. using namespace std;  
  14. void ruler(int *m,int *n);  
  15. int main()  
  16. {  
  17.     int a[MAX + 10];  
  18.     int b[MAX + 10];  
  19.     //变为0  
  20.     memset(a,0,sizeof(a));  
  21.     memset(b,0,sizeof(b));  
  22.     //初始化a  
  23.     a[0] = 1;  
  24.     a[1] = 3;  
  25.     int nLine;  
  26.     cin>>nLine;//n行输入  
  27.     int num = nLine/2;  
  28.     while(num){  
  29.         ruler(a,b);  
  30.         ruler(b,a);  
  31.         --num;  
  32.     }  
  33.     if(nLine%2 == 1){  
  34.         ruler(a,b);  
  35.     }  
  36.   
  37. }  
  38. void ruler(int *m,int *n)  
  39. {  
  40.     //m 代表已知的那一行,n 是要求的,  
  41.     int i,j;//i j 分别为m ,n 的  
  42.     i = j = 0;  
  43.     int sum = 1;//对m中的个数统计  
  44.     for(;m[i] != 0;++i){  
  45.         if(m[i] == m[i+1]){  
  46.             ++sum;  
  47.         }  
  48.         else{  
  49.             n[j] = sum;  
  50.             n[++j] = m[i];  
  51.             sum = 1;  
  52.             ++j;  
  53.         }  
  54.     }  
  55.     //输出打印新的,也就是n  
  56.     for(i = 0;n[i] != 0;++i){  
  57.         cout<<n[i]<<" ";  
  58.     }  
  59.     cout<<endl;  
  60. }  
3【数学黑洞】编程验证:数平方和运算的怪圈、数学黑洞 153、卡普雷卡尔常数、西西弗斯串。(任选其二)

可以证明只需要验证一部分,

[cpp]  view plain  copy
  1. //数平方和运算的怪圈  
  2. #include<stdio.h>  
  3. bool isresult(int n);  
  4. int main()  
  5. {  
  6.     for(int num = 1;num <= 999;++num){  
  7.         if(isresult(num) == true){  
  8.             //printf("%d\n",num);  
  9.         }  
  10.         else{  
  11.             printf("%d is not\n",num);  
  12.         }  
  13.     }  
  14.     return 0;  
  15. }  
  16. bool isresult(int n)  
  17. {  
  18.     int sum = 0;  
  19.     //求sum  
  20.     while(n){  
  21.         int temp = n%10;  
  22.         sum += temp*temp;  
  23.         n /= 10;//从个位开始求每一位  
  24.     }  
  25.     //判断  
  26.     if((sum == 1)||(sum == 145)){  
  27.         return true;  
  28.     }  
  29.     else{  
  30.         return isresult(sum);  
  31.     }  
  32.   
  33. }  
//西西弗斯串
[cpp]  view plain  copy
  1. #include<iostream>  
[cpp]  view plain  copy
  1. //输出不能达到的数,和能的数  
  2. using namespace std;  
  3. bool is123(int n);  
  4. int main()  
  5. {  
  6.     int num;  
  7.     for(num = 1;num <= 999;++num){  
  8.         if(is123(num) == true){  
  9.             //cout<<num<<"is"<<endl;  
  10.             continue;  
  11.         }  
  12.         else{  
  13.             cout<<num<<"is not"<<endl;  
  14.             continue;  
  15.         }  
  16.     }  
  17.     return 0;  
  18. }  
  19. bool is123(int n)  
  20. {  
  21.     int oshu,jishu,weishu;  
  22.     //分别是偶数,奇数,位数  
  23.     int endnum = 0;  
  24.     oshu = jishu = 0;  
  25.     if(n >= 100){  
  26.         weishu = 3;  
  27.         if((n/100%2) == 0){  
  28.             ++oshu;  
  29.         }  
  30.         else{  
  31.             ++jishu;  
  32.         }  
  33.         if((n/10%10%2) == 0){  
  34.             ++oshu;  
  35.         }  
  36.         else{  
  37.             ++jishu;  
  38.         }  
  39.         if((n%100%2) == 0){  
  40.             ++oshu;  
  41.         }  
  42.         else{  
  43.             ++jishu;  
  44.         }  
  45.     }  
  46.     else if(n >= 10){  
  47.         weishu = 2;  
  48.         if((n/10%2) == 0){  
  49.             ++oshu;  
  50.         }  
  51.         else{  
  52.             ++jishu;  
  53.         }  
  54.         if((n%10%2) == 0){  
  55.             ++oshu;  
  56.         }  
  57.         else{  
  58.             ++jishu;  
  59.         }  
  60.     }  
  61.     else{  
  62.         weishu = 1;  
  63.         if((n%2) == 0){  
  64.             ++oshu;  
  65.         }  
  66.         else{  
  67.             ++jishu;  
  68.         }  
  69.     }  
  70.   
  71.     endnum = oshu*100+jishu*10+weishu;  
  72.     if(endnum == 123)  
  73.         return true;  
  74.     else{  
  75.         return is123(endnum);  
  76.     }  
  77. }  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值