for循环,为什么我总爱把问题想复杂了
2010-11-20 12:49
176 查看
求1-100之间的素数
用这个数去除2-sqrt(i),如果有一个数能被除断,则为合数
我总把思维停在能除断上,
所以 if(i%j==0) break;
可是又加 if(i%j!=0) printf("%d",i);
孰不知必需将i去除以2-sqrt(i)之间所有的数后,才可以printf.
也就是说在内层循环被除数时,可以有一个leap标记,主要是判断
i是否为素数。
#include"math.h"
void main()
{int i,j,leap=1;
for(i=1;i<=100;i++)
{for(j=2;j<=sqrt(i);j++)
if(i%j==0)
{leap=0;
break;
}
if(leap)
printf("%4d",i);
leap=1;
}
getch();
}
首先leap=1,如果能除断,leap=0;break;注意这里break的作用范围,
它只跳出
for(j=2;j<=sqrt(i);j++)
if(i%j==0)
{leap=0;
break;
}
而
if(leap)
printf("%4d",i);
leap=1;
是没有包含在里面的,所以它还是会被执行,如果i为素数,则到这里,
leap还是1,就会执行printf。否则leap=0,不会打印合数,再把leap值
置为1,这是必须的。
你可以这样理解这里的leap=1;
它就是一个i的"假素数"标记,用j值检验i,到最后,若它货真价实,就
是好东西。
大括号里面结束,再就i<=100;i++
直到打印出所有素数。
冒泡排序
简单点说,有多少个数,就要进行多少趟冒泡排序(其实最后一趟不必)
一趟排序,只选出最大的或最小的
想一想,从第一个位置开始排,把最后一个数和它前面的数比较,把最大(小)
的放在第一个位置,再排第二个位置。如此。
#include"stdio.h"
void main()
{int A[5],i,j,temp;
for(i=0;i<=4;i++) //循环输入
scanf("%d",&A[i]);
for(i=0;i<=4;i++)
{for(j=4;j>=i;j--)
if(A[j]>A[j-1])
{temp=A[j]; //将大数前移,放到指定位置
A[j]=A[j-1];
A[j-1]=temp;
}
}
for(i=0;i<=4;i++) //循环输出
printf("%4d",A[i]);
getch();
}
for(j=4;j>=i;j--)
这里,j>=i算是把已经排好的位置不管,再从其它的数里选出最大的。
放在下一个位置。
求1!+2!+3!+4!+...+N!
我开始的思路是两层for循环
main()
{int N,i,j,k=1,s=0;
printf("please input the integer:");
scanf("%d",&N);
for(i=1;i<=N;i++)
{for(j=1;j<=i;j++)
{k*=j;}
s+=k;
}
printf("1!+2!+3!+...+N!=%d/n",s);
getch();
}
这里
for(j=1;j<=i;j++)
{k*=j;}
就是算N!
而s+=k;就是求和了。
想得美
看看输出结果
please input the integer:3
1!+2!+3!+...+N!=15
而1!+2!+3!=1*1+2*1+3*2*1=9
哪儿有问题?
令N=3
有 for(i=1;i<=3;i++)
{for(j=1;j<=i;j++)
{k*=j;}
s+=k;
}
当i=1时,k=1,s=1
i=2,k=2,s=1+2=3
i=3,k=k*j=2*1*2*3=12,s=s+k=3+12=15
就是这里
你会发现,k值是把原来的k值带进去l
所求的根本不是N!,而是N!*k
然后,我就得出了我很爱自作聪明的结论。
正确算法
main()
{int N,i;
long k=1,s=0;
printf("please input the integer:");
scanf("%d",&N);
for(i=1;i<=N;i++)
{k*=i;
s+=k;
}
printf("1!+2!+3!+...+N!=%ld/n",s);
getch();
}
please input the integer:3
1!+2!+3!+...+N!=9
想一想,3!=2!*3, 4!=3!*4 ,...
for(i=1;i<=N;i++)
{k*=i;
s+=k;
}
i值每自加一次,k值就是(原先的数)!*新数=(新数)!
s就把(新数)!加进去
以后多多思考。
用这个数去除2-sqrt(i),如果有一个数能被除断,则为合数
我总把思维停在能除断上,
所以 if(i%j==0) break;
可是又加 if(i%j!=0) printf("%d",i);
孰不知必需将i去除以2-sqrt(i)之间所有的数后,才可以printf.
也就是说在内层循环被除数时,可以有一个leap标记,主要是判断
i是否为素数。
#include"math.h"
void main()
{int i,j,leap=1;
for(i=1;i<=100;i++)
{for(j=2;j<=sqrt(i);j++)
if(i%j==0)
{leap=0;
break;
}
if(leap)
printf("%4d",i);
leap=1;
}
getch();
}
首先leap=1,如果能除断,leap=0;break;注意这里break的作用范围,
它只跳出
for(j=2;j<=sqrt(i);j++)
if(i%j==0)
{leap=0;
break;
}
而
if(leap)
printf("%4d",i);
leap=1;
是没有包含在里面的,所以它还是会被执行,如果i为素数,则到这里,
leap还是1,就会执行printf。否则leap=0,不会打印合数,再把leap值
置为1,这是必须的。
你可以这样理解这里的leap=1;
它就是一个i的"假素数"标记,用j值检验i,到最后,若它货真价实,就
是好东西。
大括号里面结束,再就i<=100;i++
直到打印出所有素数。
冒泡排序
简单点说,有多少个数,就要进行多少趟冒泡排序(其实最后一趟不必)
一趟排序,只选出最大的或最小的
想一想,从第一个位置开始排,把最后一个数和它前面的数比较,把最大(小)
的放在第一个位置,再排第二个位置。如此。
#include"stdio.h"
void main()
{int A[5],i,j,temp;
for(i=0;i<=4;i++) //循环输入
scanf("%d",&A[i]);
for(i=0;i<=4;i++)
{for(j=4;j>=i;j--)
if(A[j]>A[j-1])
{temp=A[j]; //将大数前移,放到指定位置
A[j]=A[j-1];
A[j-1]=temp;
}
}
for(i=0;i<=4;i++) //循环输出
printf("%4d",A[i]);
getch();
}
for(j=4;j>=i;j--)
这里,j>=i算是把已经排好的位置不管,再从其它的数里选出最大的。
放在下一个位置。
求1!+2!+3!+4!+...+N!
我开始的思路是两层for循环
main()
{int N,i,j,k=1,s=0;
printf("please input the integer:");
scanf("%d",&N);
for(i=1;i<=N;i++)
{for(j=1;j<=i;j++)
{k*=j;}
s+=k;
}
printf("1!+2!+3!+...+N!=%d/n",s);
getch();
}
这里
for(j=1;j<=i;j++)
{k*=j;}
就是算N!
而s+=k;就是求和了。
想得美
看看输出结果
please input the integer:3
1!+2!+3!+...+N!=15
而1!+2!+3!=1*1+2*1+3*2*1=9
哪儿有问题?
令N=3
有 for(i=1;i<=3;i++)
{for(j=1;j<=i;j++)
{k*=j;}
s+=k;
}
当i=1时,k=1,s=1
i=2,k=2,s=1+2=3
i=3,k=k*j=2*1*2*3=12,s=s+k=3+12=15
就是这里
你会发现,k值是把原来的k值带进去l
所求的根本不是N!,而是N!*k
然后,我就得出了我很爱自作聪明的结论。
正确算法
main()
{int N,i;
long k=1,s=0;
printf("please input the integer:");
scanf("%d",&N);
for(i=1;i<=N;i++)
{k*=i;
s+=k;
}
printf("1!+2!+3!+...+N!=%ld/n",s);
getch();
}
please input the integer:3
1!+2!+3!+...+N!=9
想一想,3!=2!*3, 4!=3!*4 ,...
for(i=1;i<=N;i++)
{k*=i;
s+=k;
}
i值每自加一次,k值就是(原先的数)!*新数=(新数)!
s就把(新数)!加进去
以后多多思考。
相关文章推荐
- //栈//为什么我总把简单的问题搞那么复杂?//Ignatius Train Station------二X
- 为什么世界要那么复杂呢???1-5最大间隙问题
- [导入]复杂或有趣的MDX问题求解(1)-多个相关列参与求加权平均值
- 解决复杂布局中跑马灯不能跑的问题
- Jpa分表和复杂SQL转换成Pojo问题
- 为什么支持向量机和感知机等问题都有原始和对偶问题之分
- Openjudge 百练 03:复杂的整数划分问题
- 关于int范围中负数最小值的绝对值比整数最大值大初学C,问题源自:为什么C中的int类型(16位)的下溢下限为-32768而上溢上限却是32767。 首先说吧,32767很容易理解,32767=
- 数据集市层——论为什么随着技术分析的深入,决策数据报表问题越来越多
- 为什么Spring Boot推荐使用logback-spring.xml来替代logback.xml来配置logback日志的问题分析
- 关于AutoCompleteTextView 为什么必须输入两个字符才能出现补全提示的问题的解决办法
- C# List 添加元素的问题(为什么我的元素都变一样了)
- 复杂问题解决思路
- 为什么Win7下鼠标唤醒和视频加速CPU占用过高?如何解决问题
- 问题1.Activity为什么开始要调用onCreate()?这是由谁管理的,不应该是调用初始构造函数吗?
- 为什么在使用expect的过程中常常遇到spawn命令找不到的问题,谈谈我的例子
- 硬件十万个为什么——运放篇(八)运算放大器容性负载驱动问题
- 为什么数学家、统计学家和机器学习专家会用不同方式解决问题?
- 问题:做了一个获得焦点和失去焦点的js,为什么在火狐上运行都是先失去后获得?