C语言经典例题整理

2. 从键盘获取一个年份 , 判断其是否为闰年
闰年判断方法 : 能被 4 正常且不能被 100 整除 , 或者能被 400 整除就是闰年 , 否则不是闰年
int main ()
{
int a = 10 ;
int year ;
scanf ( "%d" , & year );
if (( year % 4 == 0 && year % 100 != 0 ) || year % 400 == 0 )
printf ( "%d 是闰年 \n" , year );
else
printf ( "%d 不是闰年 \n" , year );
return 0 ;
}
输出 2000 2500 的闰年
int main ()
{
for ( int i = 2000 ; i <= 2500 ; ++ i )
{
if ( i % 4 == 0 && i % 100 != 0 || i % 400 == 0 )
printf ( "%d\n" , i );
}
return 0 ;
}
3. 1+2+3+...+n 的和
//1+2+3+4+...+n
int main ()
{
int n ;
scanf ( "%d" , & n );
int sum = 0 ;
for ( int i = 1 ; i <= n ; i ++ )
{
sum += i ; //sum = sum + i;
}
printf ( " =%d\n" , sum );
printf ( " 利用求和公式 :%d\n" ,( 1 + n ) * n / 2 ); // 除了利用上面的循环求解 , 还可以使用求和公式
return 0 ;
}
1. 从键盘获取三个整数 , 从大到小输出这 3 个数字 .
int main ()
{
printf ( "%d,%d,%d,%d\n" , 7 % 3 , - 7 % 3 , 7 %- 3 , - 7 %- 3 ); //1,-1,1,-1
//7/3= 2 ... 1 平常用
//-7/3=-2 ... -1 考试
//7/-3=-2 ... 1 考试
//-7/-3=2...-1 考试
return 0 ;
}
int main ()
{
int a , b , c ;
int tmp = 0 ;
//scanf("%d,%d,%d\n",&a,&b,&c);// 不要使用这种方式
//int len =scanf("%d%d%d",&a,&b,&c);// 提示 , 接收返回值
//(void)scanf("%d%d%d", &a, &b, &c);// 显示说明丢弃返回值
scanf ( "%d%d%d" , & a , & b , & c );
//printf("%d,%d,%d\n",a,b,c);
//printf("len=%d\n",len);
if ( a < b ) // 交换
{
tmp = a ;
a = b ;
b = tmp ;
} //a >= b
if ( a < c )
{
tmp = a ;
a = c ;
c = tmp ;
} //a>=c
if ( b < c )
{
tmp = b ;
b = c ; c = tmp ;
}
printf ( "%d,%d,%d\n" , a , b , c );
return 0 ;
}
2.1+2+3+4+...+100
int main ()
{
printf ( "%d\n" ,( 1 + 100 ) * 100 / 2 );
return 0 ;
}
3. 判断一个数 n 能否同时被 3 5 整除
int main ()
{
int n ;
scanf ( "%d" , & n );
if ( n % 3 == 0 && n % 5 == 0 )
printf ( "%d 能整除 3 5\n" , n );
else
printf ( "%d 不能整除 3 5\n" , n );
return 0 ;
}
4. 输出 100~200 之间的素数
int main ()
{
int j ;
for ( int i = 100 ; i < 200 ; i ++ )
{
// 判断 i 是否为素数
//for (j = 2; j < i; j++)
//{
// if (i % j == 0)// 不是素数
// break;// 跳出一层循环
//}
//if (j == i)
// printf("%d 是素数 \n",i);
// 优化 , 只需要遍历到 n^1/2
for ( j = 2 ; j <= sqrt ( i ); j ++ )
{
if ( i % j == 0 )
break ;
}
if ( j > sqrt ( i ))
printf ( "%d 是个素数 \n" , i );
}
return 0 ;
}
1. 假如我国国民生产总值的年增长率为 7% , 计算 10 年后我国国民生产总值与现在相比增长多少百分比 。
计算公式为 p = (l + r )^n. 其中 r 为年增长率, n 为年数, p 为与现在相比的倍数 。
pow 函数 , 计算 x y 次方 , 需要引入 math.h 文件
2. 存款利息的计算
10000 元,想存 5 年,可按以下 5 种办法存 :
(1) 一次存 5 年期。
(2) 先存 2 年期,到期后将本息再存 3 年期。
(3) 先存 3 年期,到期后将本息再存 2 年期 。
(4) 1 年期,到期后将本息再存 1 年期,连续存 5 次 。
(5) 存活期存款。活期利息每一季度结算一次 。
2017 年的银行存款利息如下 :
1 年期定期存款利息为 1.5%;
int main ()
{
double p = 1 ;
for ( int i = 0 ; i < 10 ; i ++ ) //1. 利用循环计算 (l + r )^n
p = p * ( 1 + 0.07 );
printf ( "%f\n" , p );
//printf("%f\n",pow(1+0.07,10));//2. 利用 pow 函数计算 (l + r )^n
return 0 ;
}
2 年期定期存款利息为 2.1%;
3 年期定期存款利息为 2.75%;
5 年期定期存款利息为 3%;
活期存款利息为 0.35%( 活期存款每一季度结算一次利息) 。
如果 r 为年利率, n 为存款年数,则计算本息和的公式如下:
1 年期本息和: P =10000 * (1 + r ) ;
n 年期本息和: P = 10000 * (1 + n * r);
n 1 年期的本息和 : P = 10000 * (1 +r)^n ;
活期存款本息和 : P = 10000* (1 + r/4)^4n;
.说明: 10000* (1 + r/4 ) 是一个季度的本息和 。
int main ()
{
double m = 10000 ;
double tmp ;
printf ( "5 年本息和 :%f\n" , m * ( 1 + 5 * 0.03 ));
tmp = m * ( 1 + 2 * 0.021 );
tmp = tmp * ( 1 + 3 * 0.0275 );
printf ( "2+3 年本息和 :%f" , tmp ); //2+3 年和 3+2 年结果相同
tmp = m ;
for ( int i = 0 ; i < 5 ; i ++ )
{
tmp = tmp * ( 1 + 0.015 );
}
printf ( "1+1+...+1 年本息和 :%f\n" , tmp );
printf ( " 活期本息和 :%f\n" , m * pow (( 1 + 0.0035 / 4 ), 4 * 5 ));
return 0 ;
}
3. 文字加密
从键盘读取 5 个字母 , 并把这 5 个字母加密 , 然后输出 . 加密规则是 : 用原来的字母后面第 4 个字母代替原来的
字母。例如 , 字母 "A" 后面第 4 个字母是 "E"; 字母 "b" 后面第 4 个字母是 "f", 但是需要注意字母 "Z" 后面第 4 个字
母是 "D"; 字母 "x" 后面第 4 个字母是 "b".
例如 , 从键盘读取的是 'Y','e','l','l','o' 加密后输出 'C','i','p','p','s'
int main ()
{
char a ;
for ( int i = 0 ; i < 5 ; i ++ ) // 从键盘获取 5 次字符
{
scanf ( "%c" , & a );
//printf("%c",a+4);
if ( 'a' <= a && a <= 'v' || 'A' <= a && a <= 'V' )
printf ( "%c" , a + 4 );
else if ( 'v' < a && a <= 'z' || 'V' < a && a < 'Z' ) // 最后 4 个字符特殊处理
printf ( "%c" , a - 22 );
}
return 0 ;
}
4. 从键盘获取两个整数 , 求这两个数的最大公约数
int main () // 方法 1: 从头到尾依次遍历 , 最后的公约数就是最大公约数
{ // 也可以从后往前遍历 , 那第一个公约数就是最大公约数
int m ;
int n ;
scanf ( "%d %d" , & m , & n ); //10,15
int tmp = 1 ; // 保存公约数
for ( int i = 1 ; i <= m ; i ++ ) // 从头到尾遍历所有可能
{
if ( m % i == 0 && n % i == 0 )
tmp = i ;
}
printf ( " 最大公约数 =%d\n" , tmp );
return 0 ;
}
int main () // 方法 2: 辗转相除法 ,r 余数为 0, n 就是最大公约数
{
int m ;
int n ;
scanf ( "%d %d" , & m , & n ); //10,15
int r ; // 余数
for ( r = m % n ; r != 0 ; )
{
m = n ;
n = r ;
r = m % n ;
}
printf ( "%d\n" , n );
return 0 ;
}
1. 从键盘获取两个整数 , 求这两个数的最小公倍数
int main ()
{
int m , n ;
scanf ( "%d%d" , & m , & n );
for ( int i = m ; i <= m * n ; i ++ )
{
if ( i % m == 0 && i % n == 0 )
{
printf ( "%d\n" , i );
break ; // 跳出一层循环
//return 0;// 结束这个函数
}
}
printf ( "bye\n" );
return 0 ;
}
2. 设圆半径 r=1.5, 圆柱高 h=3, 求圆周长、圆面积、圆球表面积 、圆球体积、圆柱体积。输出计算结果,
输出时要求有文字说明 ( 例如 : 圆周长 =3.00) ,取小数点后 2 位数字
3. 从键盘输入一个小于 1000 的正数,要求输出它的平方根(如平方根不是整数,则输出其整数部分)。
要求在输入数据后先对其进行检查是否为小于 1000 的正数。若不是,则要求重新输入
int main ()
{
int n ;
do
{
printf ( " 请输入一个小于 1000 的正数 \n" );
scanf ( "%d" , & n );
} while ( n < 0 || n >= 1000 );
printf ( "%d\n" ,( int ) sqrt ( n ));
return 0 ;
}
输出乘法口诀表 . 如下图
int main ()
{
for ( int i = 1 ; i <= 9 ; i ++ )
{
for ( int j = 1 ; j <= i ; j ++ )
{
printf ( "%d*%d=%-2d " , j , i , i * j ); //%-2d: 占两个字符 , 左对齐
}
printf ( "\n" );
}
return 0 ;
}
1. 给一个不多于 5 位的正整数,要求 :
(1) 求出它是几位数;
(2) 分别输出每一位数字;
(3) 按逆序输出各位数字,例如原数为 321, 应输出 123
int main ()
{
int n ;
do
{
printf ( " 请输入一个不多于 5 位的正整数 \n" );
scanf ( "%d" , & n );
} while ( 0 >= n || 100000 <= n ); // 读取一个合理的数字
int a = n % 10 ; // 个位
int b = ( n / 10 ) % 10 ; // 十位
int c = ( n / 100 ) % 10 ; // 百位
int d = ( n / 1000 ) % 10 ; // 千位
int e = n / 10000 ; // 万位
if ( n < 10 )
{
printf ( "1 位数字 \n" );
printf ( " 顺序输出 :%d\n" , a );
printf ( " 逆序输出 :%d\n" , a );
}
else if ( n < 100 ) //45
{
printf ( "2 位数字 \n" );
printf ( " 顺序输出 :%d,%d\n" , b , a );
printf ( " 逆序输出 :%d,%d\n" , a , b );
}
else if ( n < 1000 ) //123
{
printf ( "3 位数字 \n" );
printf ( " 顺序输出 :%d,%d,%d\n" , c , b , a );
printf ( " 逆序输出 :%d,%d,%d\n" , a , b , c );
}
else if ( n < 10000 ) //1234
{
printf ( "4 位数字 \n" );
printf ( " 顺序输出 :%d,%d,%d,%d\n" , d , c , b , a );
printf ( " 逆序输出 :%d,%d,%d,%d\n" , a , b , c , d );
}
else //12345
{
printf ( "5 位数字 \n" );
printf ( " 顺序输出 :%d,%d,%d,%d,%d\n" , e , d , c , b , a );
printf ( " 逆序输出 :%d,%d,%d,%d,%d\n" , a , b , c , d , e );
}
return 0 ;}
2. 企业发放的奖金根据利润提成。利润 I 低于或等于 100000 元的,奖金可提成 10%; 利润高于 100000
元,低于 200000 (100000<I<=200000) 时,低于 100000 元的部分按 10% 提成,高于 100000 元的部
分,可提成 7.5%; 200000<I<=400000 时,低于 200000 元的部分仍按上述办法提成(下同)。高于
200000 元的部分按 5% 提成; 400000<I<=600000 元时,高于 400000 元的部分按 3% 提成;
600000<I<=1000000 时,高于 600000 元的部分按 1.5% 提成; I>1000000 时,超过 1000000 元的部分按
1% 提成。从键盘输入当月利润 I, 求应发奖金总数。
int main ()
{
double I ; // 利润 , 不建议使用 I 变量 , 容易和其它符号混淆 ,I,l,1
double m ; // 奖金
printf ( " 请输入利润 \n" );
scanf ( "%lf" , & I );
if ( I <= 100000 )
{
m = I * 0.1 ;
}
else if ( I <= 200000 )
{
m = 100000 * 0.1 + ( I - 100000 ) * 0.075 ;
}
else if ( I <= 400000 )
{
m = 100000 * 0.1 + ( 200000 - 100000 ) * 0.075 + ( I - 200000 ) * 0.05 ;
}
else if ( I <= 600000 )
{
m = 10000 + 7500 + 10000 + ( I - 400000 ) * 0.03 ;
}
else if ( I <= 1000000 )
{
m = 10000 + 7500 + 10000 + 6000 + ( I - 600000 ) * 0.015 ;
}
else
{
m = 10000 + 7500 + 10000 + 6000 + 6000 + ( I - 1000000 ) * 0.01 ;
}
printf ( " 利润为 %.2f, 对应的奖金为 %.2f\n" , I , m );
return 0 ;
}
3. 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
int main ()
{
int alpha = 0 ; // 英文字符
int blank = 0 ; // 空格
int digit = 0 ; // 数字
int other = 0 ; // 其它
int ch ;
while (( ch = getchar ()) != '\n' ) //, 从键盘获取一行字符 , 非常重要 {
//if('a'<=ch&&ch<='z' || 'A'<=ch&&ch<='Z')// 英文字符 , 前提 : 字母连续
if ( isalpha ( ch ))
alpha ++ ;
else if ( ch == ' ' )
blank ++ ;
//else if('0'<=ch &&ch<='9')// 可以使用
else if ( isdigit ( ch ))
digit ++ ;
else
other ++ ;
}
printf ( "%d,%d,%d,%d\n" , alpha , blank , digit , other );
return 0 ;
}
4. 一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如, 6 的因子为 1,2,3 6=1+2+3, 因 此
6 是"完数"。编程序找出 1000 之内的所有完数 , 并输出。
int main ()
{
int sum = 0 ; // 因子和
for ( int i = 1 ; i < 1000 ; i ++ )
{
sum = 0 ; // 这个一定要在这赋值
for ( int j = 1 ; j < i ; j ++ ) // 遍历 i 的所有因子
{
if ( i % j == 0 )
sum += j ;
}
if ( sum == i ) // 完数
{ // 下面是具体的输出方式
printf ( "%d=1" , i );
for ( int j = 2 ; j < i ; j ++ )
{
if ( i % j == 0 )
printf ( "+%d" , j );
}
printf ( "\n" );
}
}
return 0 ;
}
5. 猴子吃桃问题。猴子第 1 天摘下若干个桃子,当即吃了一半,还不过瘾,又多吃了一个。第 2 天早上又
将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第 10 天早上
想再吃时,就只剩一个桃子了。求第 1 天共摘多少个桃子。
int main ()
{
int sum = 1 ;
for ( int i = 9 ; i >= 1 ; i -- )
{
sum = ( sum + 1 ) * 2 ;
}
printf ( "%d\n" , sum );
return 0}
1. 给定一个整数 , 输出该整数是一个几位数字 , 数字可能是负数 ,0 或者正数 .
例如 12345678 输出 8; 0 输出 1; -123456789 输出 9
说明 : 这题主要的知识点 : 如何丢弃个位数字 .
2. 给定一个整数 , 逆序输出每一位 ,, 数字可能是负数 ,0 或者正数 .
例如 123456789, 输出 9 8 7 6 5 4 3 2 1
例如 -123456789, 输出 -9 8 7 6 5 4 3 2 1
int main ()
{
//int n;//4 字节 =32 , 2^10=1024~=1k;2^20~=100 =1M;2^30~=10 亿 =1G
long long n ; //8
//scanf("%d", &n);//error,%d 用来读取十进制整型
scanf ( "%lld" , & n ); //printf("%lld\n",n);
long long m = n ;
if ( n == 0 )
printf ( "%lld 是个 1 位数 \n" , n );
//else
//n = llabs(n);// 求绝对值
else if ( n < 0 )
n = - n ;
int count = 0 ; // 统计位数
while ( n != 0 )
{
count ++ ;
n /= 10 ; // 丢弃个位
}
printf ( "%lld 是个 %d 位数字 \n" , m , count );
return 0 ;
} // 得到个位数字 , 然后再丢弃
int main ()
{
long long x ;
scanf ( "%lld" , & x );
if ( x < 0 )
{
printf ( "-" );
x = - x ; //char :-128~127,bug
}
if ( x == 0 )
{
printf ( "0\n" );
return 0 ;
}
while ( x != 0 )
{
printf ( "%d " , x % 10 ); // 得到个位数字
x /= 10 ; // 丢弃个位数字
}
return 0 ;
}
3. 求斐波那契 (Fibonacci) 数列的第 n 个数 , 即从键盘输入 n 则输出第 n 项的值 ,n 1 开始。这个数列有如下特
点:第 1 2 两个数为 1 1 。从第 3 个数开始,该数是其前面两个数之和 . 例如 1,1,2,3,5,8,13,21,......
int main ()
{
int n ;
scanf ( "%d" , & n );
int f1 = 1 ;
int f2 = 1 ;
int f3 = 1 ; // 计算当前值
for ( int i = 3 ; i <= n ; i ++ )
{
f3 = f1 + f2 ;
f1 = f2 ;
f2 = f3 ;
}
printf ( "%d\n" , f3 );
return 0 ;
}
说明 : 斐波那契额数列可以使用循环实现 , 最好不要使用递归实现 , 因为这题递归的时间复杂度太大 .
long long Fibon ( int n ) // 递归 , 太慢 O(2^n), 最不适合使用递归
{
if ( n < 3 )
return 1 ;
return Fibon ( n - 1 ) + Fibon ( n - 2 );
}
int main ()
{ for ( int i = 1 ; i < 50 ; i ++ )
{
printf ( "%lld\n" , Fibon ( i ));
}
return 0 ;
}
4. Sn=a+aa+aaa+…+aa…a 之值,其中 a 是一个数字, n 表示 a 的位数, a n 由键盘输入。例如:
2+22+222+2222+22222( 此时 a=2,n=5).
int main ()
{
int tmp = 0 ; // 构造的当前数字
int sum = 0 ; //
int a ;
int n ;
scanf ( "%d %d" , & a , & n );
for ( int i = 1 ; i <= n ; i ++ )
{
tmp = tmp * 10 + a ; // 构造数字
sum += tmp ;
}
printf ( "%d\n" , sum );
return 0 ;
}
5. 求阶乘的和 ,1!+2!+3!+4!+…+n!, 其中 n 由键盘读取 .
int main ()
{
int tmp = 1 ; // 当前阶乘的值
int sum = 0 ; //
int n ;
scanf ( "%d" , & n );
if ( n == 0 )
{
printf ( "1\n" );
return 0 ;
}
for ( int i = 1 ; i <= n ; i ++ )
{
tmp *= i ; // 当前阶乘值
sum += tmp ;
}
printf ( "%d\n" , sum );
return 0 ;
}
1. 给定一个整数 , 顺序输出该整数每一位数字 , 数字可能是负数 ,0 或者正数 .
例如 123456789, 输出 1,2,3,4,5,6,7,8,9
例如 -123456789, 输出 -1,2,3,4,5,6,7,8,9
int main ()
{
long long n ;
scanf ( "%lld" , & n );
if ( n == 0 )
{
printf ( "0\n" );
return 0 ;
}
else if ( n < 0 )
{
printf ( "-" );
n = - n ;
}
int count = 0 ; // 统计位数
long long m = n ;
while ( m != 0 ) // 得到 m 的位数
{
count ++ ;
m /= 10 ; // 丢弃个位
}
int power = pow ( 10 , count - 1 ); // 如果 n==123456,power=100000
while ( n != 0 )
{
printf ( "%d," , n / power ); // 输出最高位
n %= power ; // 丢弃最高位
power /= 10 ;
}
return 0 ;
}
2. 输出所有的 " 水仙花数 " ,所谓 " 水仙花数 " 是指一个 3 位数,其各位数字立方和等于该数本身。 例如,
153 是水仙花数,因为
int main ()
{ int a , b , c ; // 个位 , 十位 , 百位
for ( int i = 100 ; i < 1000 ; i ++ )
{
a = i % 10 ; // 个位
b = ( i / 10 ) % 10 ; // 十位
c = i / 100 ; // 百位
if ( a * a * a + b * b * b + c * c * c == i )
{
printf ( "%d\n" , i );
}
}
return 0 ;
}
3. 一个球从 100m 高度自由落下,每次落地后反弹回原高度的一半,再落下,再反弹。求它在第 10 次落
地时共经过多少米,第 10 次反弹多高。
int main ()
{
double sum = 100 ; // 第一次落地时经过的距离
double high = 100 / 2 ; // 第一次反弹的高度
for ( int i = 1 ; i < 10 ; i ++ )
{
sum += high * 2 ;
high /= 2 ;
}
printf ( "%f,%f\n" , sum , high ); //299.609375,0.097656
return 0 ;
}
4. 从键盘获取一个正整数 , 如果把它转为 16 进制的数字 , 那么它是一个几位数呢 ? 如果把它转为 28 进制又是
一个几位数呢 ?
例如 1234 转成十六进制是 0x4D2 那么就是 3 位数字
int main () // " 个位 "
{
long long n ;
scanf ( "%lld" , & n );
if ( n == 0 )
{
printf ( "0 转为 16 进制为 1 位数 , 转为 28 进制为 1 位数 \n" );
return 0 ;}
1. 八皇后 ( 利用循环解决 )
printf ( " 一共计算了 %d \n" , tmp );
printf ( " 一共 %d 种组合 \n" , count );
return 0 ;
}
int main ()
{
int count = 0 ; // 统计符合条件的放法
for ( int q1 = 0 ; q1 < 8 ; q1 ++ ) // 第一个皇后能存放的位置
{
for ( int q2 = 0 ; q2 < 8 ; q2 ++ ) // 第二个皇后能存放的位置
{
if ( q1 == q2 || q1 == q2 + 1 || q1 == q2 - 1 ) // 皇后 2 不能和皇后 1 冲突
{
continue ;
}
for ( int q3 = 0 ; q3 < 8 ; q3 ++ ) // 第三个皇后能存放的位置
{
if ( q2 == q3 || q2 == q3 + 1 || q2 == q3 - 1 ||
q3 == q1 || q3 == q1 - 2 || q3 == q1 + 2 ) // 皇后 3 不能和前面的皇后冲突
{
continue ;
} for ( int q4 = 0 ; q4 < 8 ; q4 ++ ) // 下面都和上面的雷同
{
if ( q3 == q4 || q3 == q4 + 1 || q3 == q4 - 1 ||
q4 == q2 || q4 == q2 - 2 || q4 == q2 + 2 ||
q4 == q1 || q4 == q1 - 3 || q4 == q1 + 3 )
{
continue ;
}
for ( int q5 = 0 ; q5 < 8 ; q5 ++ )
{
if ( q4 == q5 || q4 == q5 + 1 || q4 == q5 - 1 ||
q5 == q3 || q5 == q3 - 2 || q5 == q3 + 2 ||
q5 == q2 || q5 == q2 - 3 || q5 == q2 + 3 ||
q5 == q1 || q5 == q1 - 4 || q5 == q1 + 4 )
{
continue ;
}
for ( int q6 = 0 ; q6 < 8 ; q6 ++ )
{
if ( q6 == q5 || q6 == q5 + 1 || q6 == q5 - 1 ||
q6 == q4 || q6 == q4 + 2 || q6 == q4 - 2 ||
q6 == q3 || q6 == q3 - 3 || q6 == q3 + 3 ||
q6 == q2 || q6 == q2 - 4 || q6 == q2 + 4 ||
q6 == q1 || q6 == q1 - 5 || q6 == q1 + 5 )
{
continue ;
}
for ( int q7 = 0 ; q7 < 8 ; q7 ++ )
{
if ( q7 == q6 || q7 == q6 + 1 || q7 == q6 - 1 ||
q7 == q5 || q7 == q5 + 2 || q7 == q5 - 2 ||
q7 == q4 || q7 == q4 + 3 || q7 == q4 - 3 ||
q7 == q3 || q7 == q3 - 4 || q7 == q3 + 4 ||
q7 == q2 || q7 == q2 - 5 || q7 == q2 + 5 ||
q7 == q1 || q7 == q1 - 6 || q7 == q1 + 6 )
{
continue ;
}
for ( int q8 = 0 ; q8 < 8 ; q8 ++ )
{
if ( q8 == q7 || q8 == q7 + 1 || q8 == q7 - 1 ||
q8 == q6 || q8 == q6 + 2 || q8 == q6 - 2 ||
q8 == q5 || q8 == q5 + 3 || q8 == q5 - 3 ||
q8 == q4 || q8 == q4 + 4 || q8 == q4 - 4 ||
q8 == q3 || q8 == q3 - 5 || q8 == q3 + 5 ||
q8 == q2 || q8 == q2 - 6 || q8 == q2 + 6 ||
q8 == q1 || q8 == q1 - 7 || q8 == q1 + 7 )
{
continue ;
}
printf ( "%d %d %d %d %d %d %d %d\n" ,
q1 , q2 , q3 , q4 , q5 , q6 , q7 , q8 ); // 打印不冲突
的皇后位置
count ++ ; // 统计放法数量
}
}
}
} }
}
}
}
return count ;
}
2. 给定一个数字 , 请构造它的回文数字 . 例如给定 1234, 输出 1234321, 给定 1357 输出 1357531
解题思路如下图 :
int main ()
{
long long n ;
scanf ( "%lld" , & n );
long long m = n / 10 ; // 构造回文数字 , 不需要 n 当前的个位
while ( m != 0 )
{
n = n * 10 + m % 10 ; // 得到 m 的个位 , 并添加到 n 的后面
m /= 10 ; // 丢弃个位
}
printf ( "%lld\n" , n );
return 0 ;
}
扩展 : 和上题相似的题 , 例如 : 给定一个正整数 , 判断其是否为回文数字 . 例如 1234321-> ,123421-> 不是
3. 判断 1456789876541 是否为素数 , 是输出 " 是素数 ", 不是则输出 " 不是素数 "
int main () // 几乎年年都考 , 腾讯也考过
{
long long n = 1456789876541 ;
for ( long long i = 2 ; i < n ; i ++ ) // 太慢 , 需要遍历 n
{
if ( n % i == 0 )
{
printf ( "%lld 不是素数 \n" , n );
return 0 ;
}
}
printf ( "%lld 是素数 \n" , n );
return 0 ;}
int main () // 优化的算法
{
long long n = 1456789876541 ; //n=a*b,n=n^1/2*n^1/2
for ( long long i = 2 ; i <= ( long long ) sqrt ( n ); i ++ ) // 只需要遍历 n^1/2
{
if ( n % i == 0 )
{
printf ( "%lld 不是素数 \n" , n );
return 0 ;
}
}
printf ( "%lld 是素数 \n" , n );
return 0 ;
}
1. 10 个数组元素依次赋值为 0,1, 2,3,4,5,6,7,8,9 ,要求对数组进行反转 , 即把数组的第一个值和最后一个
值交换 , 第二个和倒数第二个交换 , 依次类推 , 并输出反转后的数组 .
int main ()
{
printf ( "%d,%d,%d,%d\n" , 0 , '\0' , false , NULL ); // 输出 0,0,0,0
return 0 ;
}
int main ()
{
int arr [ 10 ] = { 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 };
int tmp ;
int i , j ;
for ( i = 0 , j = 9 ; i < j ; i ++ , j -- )
{
tmp = arr [ i ];
arr [ i ] = arr [ j ];
arr [ j ] = tmp ;
}
for ( i = 0 ; i < 10 ; i ++ )
{
printf ( "%d " , arr [ i ]); }
return 0 ;
}
2. 定义 10 个长度的整型数组 , 从键盘获取 10 个数据保存到数组中 , 输出数组的所有数据
int main ()
{
int arr [ 10 ];
for ( int i = 0 ; i < 10 ; i ++ )
{
scanf ( "%d" , & arr [ i ]);
}
for ( int i = 0 ; i < 10 ; i ++ )
{
printf ( "%d " , arr [ i ]);
}
return 0 ;
}
3. 求出上面数组中的最大值 , 最小值和平均值并输出 .
int main ()
{
int arr [ 10 ];
for ( int i = 0 ; i < 10 ; i ++ )
{
scanf ( "%d" , & arr [ i ]);
}
int max = arr [ 0 ]; // 最大值
int min = arr [ 0 ]; // 最小值
int avg = arr [ 0 ]; // 平均值
int sum = 0 ; //
for ( int i = 0 ; i < 10 ; i ++ )
{
if ( arr [ i ] > max )
max = arr [ i ];
if ( arr [ i ] < min )
min = arr [ i ];
sum += arr [ i ];
}
printf ( " 最大值 =%d, 最小值 =%d, 平均值 =%.2f\n" , max , min , sum / 10.0 );
return 0 ;
}
4. 给你一个数组 nums 。数组「前缀和」的计算公式为: rtSum[i] = sum(nums[0]…nums[i]) 。请输出
nums 的前缀和 .
例如 nums = {1,2,3,4}, 则输出 1,3,6,10, 因为缀和计算过程为 [1, 1+2, 1+2+3, 1+2+3+4]
例如 nums = {3,1,2,10,1}, 则输出 3,4,6,16,17 2.
int main ()
{
int arr [ 10 ] = { 1 , 3 , 5 , 7 , 9 , 2 , 4 , 6 , 8 , 10 };
int sum = 0 ;
for ( int i = 0 ; i < 10 ; i ++ )
{
sum += arr [ i ];
printf ( "%d " , sum );
}
return 0 ;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值