写的比较乱了,就是记忆笔记。
学习的是翁凯c语言,标题是《浙江大学翁凯教你C语言程序设计!C语言基础入门!》
1.循环控制
判断素数。(除了1和自己本身被整除,其他都无法整除)
int main(){
int x;
//scanf("%d",&x);
x = 6;//用来测试的,把scanf注释掉了
int i;
int isPrime=1; // x是素数?
for (i=2;i<x;i++){
if (x % i == 0){
isPrime=0;
break; //离开循环
}
}
if ( isPrime == 1){
printf("是素数\n");
}else{
printf("不是素数\n");
}
return 0;
}
break放在循环体里面就结束,而不用等到完全结束循环。
break:跳出循环
continue:跳过循环这一轮剩下的语句进入下一轮。
int main(){
int x;
//scanf("%d",&x);
x = 9;//用来测试的,把scanf注释掉了
int i;
int isPrime=1; // x是素数?
for (i=2;i<x;i++){
if (x % i == 0){
isPrime=0;
continue;//如果用了这个continue,那么就不会再往下执行那个printf,会回上面的for循环语句
}
printf("%d\n", i);
}
if ( isPrime == 1){
printf("是素数\n");
}else{
printf("不是素数\n");
}
return 0;
}
100以内的素数输出。(嵌套的循环)
int main(){
int x;
// scanf("%d", &x);//这个注释掉了,用x=6来测试
x = 6;//测试
for (x=2;x<100;x++)//100以内的素数,1不是,就从x=2开始
{
int i;
int isPrime = 1;//x是素数
for ( i=2;i<x;i++){//for循环里面弄了个i,检测100以内的素数
if (x%i==0){//X除以i的商为0的话,
isPrime = 0;//那么x就不是素数
break;//跳出循环,然后执行下面的语句
}
}
if ( isPrime == 1){//如果X除以i的商不为0的话,就是 int isPrime = 1
printf("%d ",x);//就把素数打印出来
}
}
printf("\n");//隔开
return 0;
}
//前五十个素数哈
int main(){
int x;
// scanf("%d", &x);//这个注释掉了,用x=6来测试
x = 2;//测试
int cnt=0;//计数器
//for (x=2;x<100;x++)//100以内的素数,1不是,就从x=2开始
//while(cnt<50)
for (x=2; cnt<50;x++)
{
int i;
int isPrime = 1;//x是素数
for ( i=2;i<x;i++){//for循环里面弄了个i,检测100以内的素数
if (x%i==0){//X除以i的商为0的话,
isPrime = 0;//那么x就不是素数
break;//跳出循环,然后执行下面的语句
}
}
if ( isPrime == 1){//如果X除以i的商不为0的话,就是 int isPrime = 1
printf("%d ",x);//就把素数打印出来
cnt ++;//计数器要自增
}
// x++ //用for循环的时候就不用x++,用while的时候要
}
printf("\n");//隔开
return 0;
}
凑硬币(如何用1角、2角、3角的硬币凑出10元以下的金额呢?)
int main(){
int x;
int one,two,five;
//scanf("%d", &x);
x = 2;//测试中
for (one = 1; one < x*10; one++ {
for(two = 1; two< x*10/2 ; two++ ){
for(five = 1; five< x*10/5; five++ ){
if (one + two*2 + five*5 == x*10){
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,two,five,x);
//break;如果只要一种结果,用break其实不行,为啥,因为break只会离开当前的for循环,也就是第三层的for(five = 1; five< x*10/5; five++ )循环,但是又继续回到了第二层的for循环,所以还是会出现很多种结果,它不能一下子跳出所有的循环。所以我们怎么跳出这个循环呢?请看下面的代码
}
}
}
}
return 0;
}
int main(){
int x;
int one,two,five;
int exit;
//scanf("%d", &x);
x = 2;//测试中
for (one = 1; one < x*10; one++ {
for(two = 1; two< x*10/2 ; two++ ){
for(five = 1; five< x*10/5; five++ ){
if (one + two*2 + five*5 == x*10){
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,two,five,x);
exit =1;
break;//如果只单独放一个break在这,它只会跳出当前的第三个循环,它还是会继续回到第二个循环,so我们在break这边加一点的条件。
}
}
if (exit ==1) break;//我们设置了一个可以跳出循环的条件
}
if (exit ==1) break;//这里也是
}
return 0;
}
它的名字叫:接力break!
当然,也可以用goto!好用!建议只在有多重循环的情况下用goto,
int main(){
int x;
int one,two,five;
//scanf("%d", &x);
x = 2;//测试中
for (one = 1; one < x*10; one++ {
for(two = 1; two< x*10/2 ; two++ ){
for(five = 1; five< x*10/5; five++ ){
if (one + two*2 + five*5 == x*10){
printf("可以用%d个1角加%d个2角加%d个5角得到%d元\n",one,two,five,x);
goto out;//go to 要去到下面的out!
}
}
}
}
out: //在这,就是跳转到这里的out
return 0;
}
前n项求和:就是1+1/2+1/3+1/4......+1/n
int main(){
int n;
int i;
double sum=0.0;
//scanf("%d", &n);
n = 100//测试中
for(i=1; i<=n; i++ ){
sum +=1.0/i;
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
但如果想实现1-1/2+1/3-1/4....怎么办?
int main(){
int n;
int i;
double sum=0.0;
int sign = 1;
//scanf("%d", &n);
n = 100//测试中
for(i=1; i<=n; i++ ){
sum +=sign*1.0/i;//这样就可以实现加一个减一个的效果了!
sign=-sign;
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
或者更妙的算法:
int main(){
int n;
int i;
double sum=0.0;
//int sign = 1;
double sign=1.0;//在这里,直接用double,就不用*1.0了!
scanf("%d", &n);
for(i=1; i<=n; i++ ){
sum +=sign/i;//这样就可以实现加一个减一个的效果了!
sign=-sign;
}
printf("f(%d)=%f\n",n,sum);
return 0;
}
整数分解:(本集超级无敌晕,,,,,,,,)
正序分解整数:输入一个非负整数,正序输出它的每一位数字,输入13425,输出1 3 4 2 5,这个我没会,不要抄这个。是错误的!!!!!!
int main(){
int x;
scanf("%d",&x);
x = 13425;
do {
int d = x % 10;
printf("%d", d);
if (x > 9 ){
printf(" ");
}
x /= 10;
} while ( x > 0 );
printf("\n");
return 0;
}
求最大公约数
辗转相除法
1.如果b等于0,计算结束,a就是最大公约数
2.否则,计算a除以b的余数,让a等于b,而b等于那个余数
3.回到第一步
//比如是a=12、b=18这样,求最大公约数,
//a b t
//12 18 12(12%18=12)
//18 12 6(18%12=6)换了个位置,让a=b
//12 6 0(12%6=0)
//6 0
int main()
{
int a ,b;
int t;
scanf("%d %d", &a,&b);
a=18;//测试
b=12;//测试
while ( b!=0 ) {
t = a%b;
a=b;
b=t;
printf("a=%d",b=%d,t=%d\n",a ,b ,t);
}
printf("gcd=%d\n", a);
return 0;
}
求符合给定条件的整数集
给定不超过6的正整数A,考虑从A开始的连续4个数字,请输出所有由他们组成的无重复数字的三位数。
int main()
{
int a;
scanf("%d", &a);
a=2//测试
int i,j,k;
int cnt= 0;
i=a;
while (i<=a+3){
j = a;
while (j<=a+3){
k=a;
while ( k<=a+3) {
if (i!=j) {
if(i!=k){
if(j!=k) {
cnt++;//计数器累加
printf("%d %d%d",i,j,k);
if (cnt == 6 ){//这里的==6是因为每一行输出6个数
printf("\n");//然后空格
cnt = 0;//计数器清零
} else {
printf(" ");
}
}
}
k++;
}
j++;
}
i++;
}
return 0;
}
水仙花数
水仙花数指的是一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身,比如153=1的三次方+5的三次方+3的三次方,
要求是3<=N<=7,
按递增顺序输出的所有N位水仙花数,每个数字占一行,
比如输入3
输出=
153
370
371
//水仙花数
//水仙花数指的是一个N位正整数(N>=3),它的每个位上的数字的N次幂之和等于它本身,比如153=1的三次方+5的三次方+3的三次方,
//要求是3<=N<=7,
//按递增顺序输出的所有N位水仙花数,每个数字占一行,
//比如输入3
//输出=
//153
//370
//
#include <stdio.h>
int main()
{
int n;
scanf("%d",&n);
n=3;//三位数
int first = 1;
int i = 1;
while( i<n ) {
first *=10;
i++;
}
printf("first=%d\n", first);
//遍历所有的三位数,100-999
i=first;
while (i<first*10) {
int t = i;
int sum = 0;
do{
int d = t%10;
t/=10;
int p = 1;
int j = 0;
while (j<n){
p *= d;
j++;
}
sum += p;
}while (t >0 );
if (sum==i){
printf("%d\n",i);
}
i++;
}
return 0;
}
九九乘法表
//打印九九口诀表
#include <stdio.h>
int main(){
int n;
scanf("%d",&n);
n=9;//测试,比如现在是99乘法表
int i,j;
i=1;
while (i<=n) {
j=1;
while (j<=i){//当j是小于等于i的时候,那么,比如现在是1*1
printf("%d*%d=%d",j,i,i*j);
if (i*j <10 ){
printf(" ");
}else{
printf(" ");
}
j++;
}
printf("\n");
i++;
}
return 0;
}