本章摘要:
2.1 for循环
2.2 while循环和do-while循环
2.3循环的代价
2.4算法竞赛中的输入输出框架
[注解]:
1、文件读写方式和命名的严格性
2、变量在赋值之前的值是不确定的
2.1 for循环
2-1 输出1,2,3·······n的值
#include<stdio.h>
int main()
{
int n, i;
scanf("%d", &n);
for(i=1; i<=n; i++){
printf("%d\n", i);
}
printf("%d\n", i); //①
return 0;
}
从①处可以看出:执行顺序是先i++,再判断
2-2 输出形如aabb的4位完全平方数:函数floor(x)返回不超过x的最大整数
#include<stdio.h>
#include<math.h>
int main()
{
int i, j, sum;
for(i=1; i<=9; i++){
for(j=0; j<=9; j++){
sum = i*1100 + j*11;
int sqr = floor(sqrt(sum) + 0.5);
if(sqr*sqr == sum)
printf("%d\n", sum);
}
}
return 0;
}
7744
不用floor(x)函数:
#include<stdio.h>
#include<math.h>
int main()
{
int i, j, num, num1;
for(i=1; i<=9; i++){
for(j=0; j<=9; j++){
num = 1100*i+11*j;
num1 = (int)sqrt((double)num);//sqrt(x):double类型
if(num == num1*num1){
printf("%d\n", num);
}
}
}
return 0;
}
枚举平方根x:
#include<stdio.h>
int main()
{
int x;
for(x=1; ; x++)
{
int n = x * x;//先确保数是完全平方数
if(n<1000){
continue;
}
if(n>9999){
break;
}
int a = n/100;
int b = n%100;
if(a/10==a%10 && b/10==b%10){
printf("%d\n", n);
}
}
return 0;
}
2-4 3*n+1问题
对于任意大于1的自然数,如果n为奇数,则n变为3*n+1,否则变为n的一半,经过若干次变换,一定会使n变为1。例如,3->10->5->16->8->4->2->1
输入n(n<=10^9)
#include<stdio.h>
int main()
{
long long n;
int k=0;
scanf("%lld", &n);
while(n!=1){
if(n%2==0){
n = n/2;
}
else{
n = 3*n+1;
}
k++;
}
printf("%d\n", k);
return 0;
}
2-6 求PI(近似求值)
#include<stdio.h>
int main()
{
int i = 1;
double sum=0.0 ,k = 1.0/(2*i-1), n;
for(; k >= 1e-6; i++){
k = 1.0/(2*i-1);
n = (-1)*k;
if(i%2!=0){
sum += (-1)*n;
}
else{
sum += n;
}
}
printf("%f\n", sum*4);
return 0;
}
2-7 阶乘和的末6位(S=1!+2!+3!+······+n!)
涉及到如何求末6位,且n<=10^6
#include<stdio.h>
int main()
{
int i,j, n, total;
long long sum = 0;
scanf("%d", &n);
for(i=1; i<=n; i++){
total =1;
for(j=1; j<=i; j++){
total = total * j;
}
sum += total;
}
int tag = sum % 1000000;
printf("%d\n", tag);
return 0;
}
10
37913
#include<stdio.h>
#include<time.h> // 头文件
int main()
{
const int m = 1000000;
int i =1, j, sum = 0, n;
scanf("%d", &n);
for(; i<=n; i++){
int factory = 1;
for(j=1; j<=i; j++){
factory = factory*j%m;
}
sum = (sum+factory)%m;
}
printf("%d\n", sum%m);
printf("%.2f\n", (double)clock()/CLOCKS_PER_SEC); // 计算运行时间(s)
return 0;
}
上面的一些程序显示了算术运算溢出和程序效率低下的问题
不同系统下,程序输入结束应该:
①Windows下,Ctrl+Z
②Linux下,Ctrl+D