本人是大三学生,希望跨考cs。在这个平台会分享一些自己做的题目,萌新起路,请多多指教。
常见的几个通项公式问题。
//计算求和 通项问题 #includeint main() { double sum;//注意这里要把sum格式改成double形式 sum=1; int n; for (n=2 ; n<=1000;n++) { sum=sum+1.0/n; } printf("%lf %dn",sum,n); return 0; } //通项求和问题 #include int main() { double k;//这里用i来代替k int i=1; double x;//注意除法用double格式 for(i=1;i<=100;i++) { k=k+i; } for(i=1;i<=50;i++) { k=k+i*i; } for(x=1.0;x<=10;x++) { k=k+1/x; } printf("%.2lf",k); return 0; } //计算通项求和 #include int main() { double n,t,sum; n=1.0; sum=1.0; t=0.0; do { t=1/(n*(n+1)); sum=t+sum; n++; } while(t>=0.001); printf("%.5lf",sum); return 0; } //依旧是通项构造 #include #include int main() { double sinx,x,eps; int f,t; f=1; int n; n=0; t=1; sinx=0; double b; b=0; scanf("%lf lf",&x,&eps); while(fabs(b)>=eps) { t=n*(n+1)*t;//重点在于这个阶乘的构造,阶乘都是乘自身,但是这个需要对比多余的量,多出两项可解 b=f*pow(x,2*n+1)/t; sinx=sinx+b; f=-f; n=n+2; } printf("%lf",sinx); return 0; } //提醒注意正负吧 #include int main() { int n,i,sum; i=0; sum=0; scanf("%d",&n); if(n>=0) { for(i=n;i<=2*n;i++) { sum=i+sum; } } else{ for(i=2*n;i<=n;i++) { sum=i+sum; } } printf("%d",sum); return 0; }
这几个通项公式求和问题都比较简单
麦子问题
也是循环的一种直接应用吧,值得注意的是要注意范围,int的范围不够
//麦子问题,提醒你注意范围,利用k作循环次数控制解放i #includeint main() { double i,sum,k,j;//注意int的范围 sum=0; i=1; for(k=1;k<=64;k++)//循环64次 { sum=i+sum; i=2*i; } j=1.42e8; printf("%.2e %.2e",sum,1.0*sum/j); return 0; }
小马中马大马问题,实质就是让你解线性方程组,用if来控制输出就行了,for用来遍历
//整数解问题 #includeint main() { int a,b,c; printf("大马t中马t小马n"); for(a=0;a<=33;a++) for(b=0;b<=50;b++) { c=100-a-b; if(c%2==0)//这个我也是用if语句来控制c是2的倍数 if( 3*a+2*b+c/2==100)//if语句来控制输出,还有注意是== printf("%dt%dt%dn ",a,b,c); } return 0; }
反序数问题大概流程其实大家都清楚,但是反序数这道题的核心思想就是遍历,我一开始设未知数没初始化是行不通的,遍历满足条件的输出就行了,知道利用遍历来做,一个个找就行了
//反序数问题 #includeint main() { int a,b,c,d,n; int sum = 0; for(n = 1000;n < 1111;n++){ a = n / 1000; b = (n % 1000) / 100; c = (n % 100) / 10; d = n % 10; sum = ((1000 * d) + (100 * c) + (10 * b) + a); if((9 * n) == sum) printf("%d 的九倍是他的反序:%dn",n,sum); } }
阿姆斯特朗数问题我是参照了
C语言求解阿姆斯特朗数_fengchuixia的博客-CSDN博客_c语言阿姆斯特朗数
这位博主设置最大数和最小数很精巧,我一开始直接默认是三位数了,当然她的代码里面我也学到了利用一个第三变量检验输出,还有保护变量
#includeint main() { int i,j,sum,p,flag;i=100; j=1; flag=1; p=1; for(i=100;i<1000;i++) { p=i;//要保护i,这个特别重要,因为i如果进入运算,会被破环,不满足条件 sum=0;//这个也特别重要因为循环里面sum是累加的 while(p)//因为每次乘法固定,可以利用循环来做 {j=p%10; p=p/10; sum+=j*j*j; } if(sum==i) { printf("%dn",sum); flag=0;//flag 来监测 ,注意检验写在循环外面 } } if(flag==1) printf("none"); return 0; }
韩信点兵问题,韩信点兵其实也是遍历的思想,只不过利用break在找到第一个之后就可以跳出循环
//点兵问题 #includeint main() { int sum; sum=0; for(sum=1;;sum++) { if(sum%5==1&&sum%6==5&&sum%7==4&&sum%11==10) break;//break跳出循环的功能,很方便找第一个数 } printf("%d",sum); return 0; }
猴子吃桃问题,猴子吃桃也是无法初始化,没有初始数,只能倒过来求,倒过来求反着流程图做就行了
//猴子吃桃问题 #includeint main() { int sum; int cnt; cnt=9; sum=1; while(cnt>=1) { sum=(sum+1)*2;//注意是先加1再乘2,可以假设第一天14个桃,第二天6个桃,这样就很清楚了,其实正常是sum=sum/2,sum=sum-1,逆序应该是从下往上 cnt--; } printf("%d",sum); return 0; }
水手分椰子问题,这个比吃桃问题复杂一点
//水手分椰子问题 #includeint main() { int a,find=0,b,c,d,e,f;; for(a=1;!find;a++) { b=5*a+1; c=b/4.0*5+1;//保护b,注意4.0 d=c/4.0*5+1; e=d/4.0*5+1; f=e/4.0*5+1; if(f%5==1&&e%5==1&&d%5==1&&c%5==1&&b%5==1)//确实没有想到这个,避免了小数问题 { find=1; printf("原有%d个椰子",f); } } return 0; }
这个也是网上找的一个答案,但是我认为不是很好,我看到过一个更好的答案
这个博主发了两种解法,但是我函数不是很熟,只看了一种解法
https://blog.csdn.net/weixin_36138524/article/details/117186537?utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-3.no_search_link
#includeint main() { int i, j, total, n; printf("Input n(1"); scanf("%d", &n); if (n <= 1 || n > 5) { printf("Error!"); } else { i = 1; while(1) { total = i; for(j = 0; j < n; j++)// { total = total * 5; if(total % 4 != 0)//判断能被4整除,确定它是整数,这确实厉害,这一步 break; total = total / 4; total += 1; } if(j == n)//清零 break; i++; } printf("y=%d", total); } return 0; }
倒三角行九九乘法表,九九乘法表很简单,但是搞成这个下上三角形确实得思考一下
//改成上三角形式数乘表 #includeint main() { int i,j,m,cnt; i = 1; j = 1; m=0; while (i <= 9) { while(j<=9) { if(i*j==1) printf("1"); else printf("%3d",i*j);//倒三角必须从前面判断,所以只能利用m,m可以使使双位末位和单位之间的间距保持一致 j++; } i++; j=i; m=m+1; cnt=m;//保护m,因为每次循环会消耗cnt printf("n"); printf(" "); while(cnt>1) {printf(" ");//无法在循环里添加空格的原因,因为循环会使空格成倍增加,所以在外循环里写个空格弥补 cnt--;} } }
编写程序,输入顶行字符和图形的高,输出如下所示图形。
就是菱形的ABCD问题,真把我难住了,不过明白了利用变量来初始化以控制循环的次数之后,就很简单了
参考了这个答主的答案,但是我觉得他的有点复杂,可能是因为没有注释的原因
编写C语言程序,输入顶行字符和图形的高,输出如下所示图形
#includeint main() { int h,i,k,j,t; scanf("%d,%c",&h,&k); for(i=0;i<(h+1)/2;i++)//控制次数,先是上三行 { for(j=i;j<(h+1)/2-1;j++) { printf(" "); } printf("%c",k);//打印字母 if(i!=0)//除了第一行以外的空格 { for(t=0;t1;i--)//下半部分的开始 { for(j=(h+1)/2+1-i;j>=1;j--) { printf(" "); } printf("%c",k); if(i!=2)//不是最后一行 { for(t=1;t<=2*(i-2)-1;t++) { printf(" "); } printf("%c",k); } printf("n"); k--; } return 0; }
最后,希望一起加油



