for
嵌套(***)1 . 打印*
组成的n*m
的长方形矩阵
例如:
输入:4 5
输出
*****
*****
*****
*****
注意:1.外行内列;
2.打印完一行,即进行换行,即执行完内部循环后;
完整代码见00101_star.c
#include <stdio.h>main(){for(int j=0;j<4;++j){for(int i=0;i<5;++i){printf("*");}printf("n");}}
*
组成n*n
的三角形输入: 4
输出
**********
注意:(1) j<=i;
(2)打印完一行,即进行换行,即执行完内部循环后;
完整代码见00102_star.c
#include <stdio.h>int main(){int n;scanf("%d",&n);int i,j;for(i=0;i<n;++i){for(j=0;j<=i;++j){printf("*");}printf("n");}return 0;
}
*
组成n*(2*n-1)
的三角形输 4
输出
****************
注意:(1) j<=2i-1;
(2)打印完一行,即进行换行,即执行完内部循环后;
完整代码见00103_star.c
#include <stdio.h>int main(){int n;scanf("%d",&n);int i,j;for(i=1;i<=n;++i){for(j=1;j<=(2*i-1);++j){printf("*");}printf("n");}return 0;
}
注意:(1) j<=i;
(2)打印完一行,即进行换行,即执行完内部循环后;
完整代码见002_9x9.c
#include <stdio.h>int main(){int n;scanf("%d",&n);int i,j;for(i=1;i<=n;++i){for(j=1;j<=i;++j){printf("%d*%d=%2d ",i,j,i*j);}printf("n");}return 0;
}
5.1 暴力破解法(多重循环)
(完整代码见00301_pailie.c)
#include <stdio.h>int main(){int i,j,k,count = 0;for(i=1;i<=4;++i){for(j=1;j<=4;++j){for(k=1;k<=4;++k){//if(i==j||i==k||j==k)continue;if(i!=j && i!=k && j!=k){ // 暴力破解法(多重循环)printf("%d%d%dn",k,j,i);count++;}}}}printf("%dn",count);
}
n
数组,打印出数组元素两两组合的结果。(完整代码见00302_pailie.c)
#include <stdio.h>int main(){int i,j,n,count = 0;printf("please input the number:n");scanf("%d",&n);for(i=1;i<=n;++i){for(j=1;j<=n;++j){printf("%d%dn",j,i);count++;}}printf("%dn",count);
}
无限循环/死循环是指判断条件永远为真的循环。
例如:
while(1){/* 如果条件为真将重复执行的语句 */}
或者
for(;;){/* 如果条件为真将重复执行的语句 */}
通常程序中要避免出现无限循环/死循环,特殊情况也会适当使用无限循环/死循环,这时可通过方式break
方式退出。
(完整代码见00101_9x9.c)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {int n;scanf("%d",&n);for(int i=1;i<=n;++i){for(int j=1;j<=i;++j){printf("%d*%d=%d ",j,i,j*i);}printf("n");}return 0;
}
(完整代码见00102_9x9.c)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {int n;scanf("%d",&n);for(int i=1;i<=n;++i){for(int j=1;j<=i;++j){printf("%d*%d=%d ",i,j,i*j);}printf("n");}return 0;
}
(完整代码见00103_star.c)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {int n;scanf("%d",&n);for(int i=1;i<=n;++i){for(int j=1;j<=i;++j){printf("*");}printf("n");}return 0;
}
(完整代码见00104_star.c)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {int n;scanf("%d",&n);for(int i=1;i<=n;++i){for(int j=1;j<=2*i-1;++j){printf("*");}printf("n");}return 0;
}
(完整代码见00105_star.c)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {int n;scanf("%d",&n);for(int i=1;i<=n;++i){for(int j=1;j<=2*i-1;++j){printf("*");}printf("n");}return 0;
}
注意1:一个变量进行循环操作;
temp = i; //(1)i负责循环;
注意2:一个变量进行判幸运 操作;
while(temp) //(2)temp进行判幸运操作{
count进行计数 操作;
(完整代码见00106——lucky.c)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {int L,R,temp,count=0;scanf("%d%d",&L,&R);for(int i=L;i<=R;++i){temp = i; //(1)i负责循环;while(temp) //(2)temp进行判幸运操作{if(temp%10==7){printf("%dn",i);break;}else{temp/=10;}if(temp==0) ++count;//(3)count 进行计数;}}if(count==R-L+1) printf("Nonen");return 0;
}
1.多重循环;(第一层负责范围;)
for(i=2;i<=n;++i) //(1)质因数的范围;
2.第二层表示:(多次相除)
while(n%i==0) //(2)质因数的判断‘
完整代码见00107——prime.c
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main()
{int n,i;scanf("%d",&n);for(i=2;i<=n;++i) //(1)质因数的范围;{while(n%i==0) //(2)质因数的判断‘{n/=i;printf("%dn",i);}}return 0;
}
完整代码见00108——month.c
#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>int main() {int y,m,n;scanf("%d%d%d",&y,&m,&n);int days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };if(y%4==0&&y%100!=0||y%400==0){days[1] = 29;}int dist = 0;for(int i=0;i<m-1;++i){dist += days[i];}int day = (dist+n)%7;printf("S M T W T F Sn",n);for(int i=0;i<day;++i){printf(" ");}for(int i=1;i<=days[m-1];++i){printf("%d",i);printf((day+i)%7 == 0?"n":i>9?" ":" ");}return 0;}
注意:浮点误差通常用+0.0001(多位的小数)进行消除
printf("%.1fn%.1fn%.1fn%.1fn%.1fn",p1*n1,p2*n2,p3*n3,p4*n4,p1*n1+p2*n2+p3*n3+p4*n4+0.001);
(完整代码见00201——price.c)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {float p1=1.2;float p2=3.5;float p3=4.5;float p4=5;float n1, n2, n3,n4;scanf("%f%f%f%f",&n1,&n2,&n3,&n4);printf("%.1fn%.1fn%.1fn%.1fn%.1fn",p1*n1,p2*n2,p3*n3,p4*n4,p1*n1+p2*n2+p3*n3+p4*n4+0.001);return 0;
}
#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>int main() {int n;scanf("%d",&n);int a = sqrt(n);a*a == n?printf("%d",a):printf("No");return 0;}
越界的三种情况
(1)正数相加为负值;
(2)负数相加为正值。
(完整代码见00203——yuejie.c)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {int x,y,sum;scanf("%d%d",&x,&y);sum=x + y;if(x < 0 && y < 0 && sum >= 0) printf("Yesn");else if(x >= 0 && y >= 0 && sum <0) printf("Yesn");else printf("Non");return 0;
}
(完整代码见00204——longxia.c)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {int n,m;long long int count=0;scanf("%d%d",&n,&m);int a[n];for(int i=0;i<n;++i){scanf("%d",&a[i]);if(a[i]>=m) count+=a[i];}printf("%lldn",count);//主要程序内容写在这里return 0;
}
注意:位与位或都是单号, | ,&,以及操作符优先级
printf("%dn",(a|b)-(a&b));
(完整代码见00301——bit.c)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {int a,b;scanf("%d%d",&a,&b);printf("%dn",(a|b)-(a&b));return 0;
}
短除法
条件: i=0;
循环:i/=2;
while(i!=0){printf("%d",i%2);i/=2;}
(完整代码见00302——bit.c)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main() {int i;scanf("%d",&i);while(i!=0){printf("%d",i%2);i/=2;}return 0;
}
注意1:将10进制的每一位转化为任意进制的函数,取出每一位,然后乘上进制
int toDec(int n,int base){int res = 0;int c = 0;while(n){int t = n%10;if(t >= base) return -1;res += t*pow(base,c);n /= 10;++c;}return res;}
(完整代码见00303——base.c)
#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>int toDec(int n,int base){int res = 0;int c = 0;while(n){int t = n%10;if(t >= base) return -1;res += t*pow(base,c);n /= 10;++c;}return res;}int main() {int a,b,c;scanf("%d%d%d",&a,&b,&c);int res = 0;for(int i=2;i<=16;++i){int n = toDec(a,i);int m = toDec(b,i);int p = toDec(c,i);if(n*m==p){res = i; break;}}printf("%d",res);return 0;}
方案:取每一位的数字,然后存到数组,然后逆序打印
(完整代码见00304——base.c)
#include <stdio.h>#include <string.h>#include <math.h>#include <stdlib.h>int main() {int n;scanf("%d",&n);int pos = 0;char res[40];while(0!=n){res[pos++] = '0'+n%2;n /= 2;}for(int i=pos-1;i>=0;--i){printf("%c",res[i]); }return 0;}
方案1:直接用itoa()函数进行求解
分析:itoa(i ,num ,10 );
i ---- 需要转换成字符串的数字
num ---- 转换后保存字符串的变量
10 ---- 转换数字的基数(即进制)。10就是说按10进制转换数字。还可以是2,8,16等等你喜欢的进制类型
返回值:指向num这个字符串的指针
scanf("%d%d",&N,&B);
strcpy(ch,itoa(N,s,B));
(完整代码见0030501——base.c)
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>int main(){
int i,N,B;
char ch[100];
char s[80];
scanf("%d%d",&N,&B);
strcpy(ch,itoa(N,s,B));
for(i=0;'