程序1】
题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?
分析:
使用
三个for循环将1,2,3,4分别填在个、十、百位上,再去掉不满足条件的即可。
#include "stdio.h"
int main(){
int i,j,k,count=0;
for (int i = 1; i <5 ; ++i) {
for (int j = 1; j <5 ; ++j) {
for (int k = 1; k <5 ; ++k) {
if(i!=j&&i!=k&&j!=k){
printf("%d%d%d\n",i,j,k);
count++;
}
}
}
}
printf("共有多少个组合:%d",count);
}
程序2】
题目:企业发放的奖金根据利润提成。利润(I)低于或等于10万元时,奖金可提10%;利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可可提成7.5%;20万到40万之间时,高于20万元的部分,可提成5%;40万到60万之间时高于40万元的部分,可提成3%;60万到100万之间时,高于60万元的部分,可提成1.5%,高于100万元时,超过100万元的部分按1%提成,从键盘输入当月利润I,求应发放奖金总数?
#include "stdio.h"
int main() {
int money;
double reward=0;
printf("请输入利润:");
scanf("%d", &money);
while (1) {
if (money > 100) {
printf("奖金为:%.2f\n",
reward = (money - 100) * 0.01 + 40 * 0.15 + 20 * 0.03 + 20 * 0.05 + 10 * 0.75 + 10 * 0.1);
break;
}
if (money > 60) {
printf("奖金为:%.2f\n", reward = (money - 60) * 0.015 + 20 * 0.03 + 20 * 0.05 + 10 * 0.75 + 10 * 0.1);
break;
}
if (money > 40) {
printf("奖金为:%.2f\n", reward = (money - 40) * 0.03 + 20 * 0.05 + 10 * 0.75 + 10 * 0.1);
break;
}
if (money > 20) {
printf("奖金为:%.2f\n", reward = (money - 20) * 0.05 + 10 * 0.75 + 10 * 0.1);
break;
}
if (money > 10) {
printf("奖金为:%.2f\n", reward = (money - 10) * 0.75 + 10 * 0.1);
break;
} else{
printf("奖金为%.2f\n",money*0.1);
}
}
}
程序3】
题目:一个整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?
分析:
死循环判断是否为平方数,再加上开方后是否为整数,我这儿错误理解完全平方数的意思,我以为只是个平方数,所以我的程序求解的是平方数,并不是完全平方数。
#include "stdio.h"
#include "math.h"
void main() {
int a = 0, b = 0, x=0;
while (1) {
a = x + 100;
b = x + 168;
float c = sqrt(a);
float d = sqrt(b);
double check_c = c - (int) c;
double check_d = d - (int) d;
x++;
if (check_c == 0 && check_d == 0) {
printf("x为:%d\n", x);
break;
}
}
}
程序4】
题目:输入三个整数x,y,z,请把这三个数由小到大输出
#include <stdio.h>
int main() {
int x, y, z, temp, max;
printf("请输入三个数字\n");
scanf("%d,%d,%d", &x, &y, &z);
max = x;
if (y > max) {
max = y;
y = x;
x = max;
}
if (z > max) {
max = z;
z = x;
x = max;
}
if (y < z) {
temp = z;
z = y;
y = temp;
}
printf("%d %d %d\n", z, y, x);
return 0;
}
程序5】
将一个正整数分解质因数。例如:输入 90, 打印出 90=2 * 3 * 3 * 5
#include <stdio.h>
void primeFactors(int n) {
// 打印出 n 的所有质因数
for (int i = 2; i <= n; i++) {
while (n % i == 0) {
printf("%d", i);
if (n != i)
printf(" * ");
n /= i;
}
}
}
int main() {
int num;
printf("输入一个正整数: ");
scanf("%d", &num);
printf("%d=", num);
primeFactors(num);
return 0;
}
程序6】
题目:输入两个正整数m和n,求其最大公约数和最小公倍数。
解析:最大公约数是二者相除然后找其余数a%b=c;
b%c=d;
....
若d=0则c为最大公约数
最小公倍数:原数a*b/c;
#include "stdio.h"
int main(){
printf("请输入两个整数,用空格分开\n");
int a=0,b=0;
scanf("%d %d",&a,&b);
int c=a,d=b;
int temp;
if(a<b){//保证a>b
temp=a;
b=a;
a=temp;
}
do {
if(b!=0){
a=a%b;
if(a!=0){
b=b%a;
}
}
} while (a!=0&&b!=0);
int x=0,y=0;
x=(b==0)?a:b;//取最后一个不为0的
printf("最大公约数是%d\n",x);
y=c*d/x;
printf("最小公倍数:%d\n",y);
}
程序7】
题目:输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。
分析:每个字符的ASCII值,查了下ASCII表:a-z:97-122;A-Z:65-90;(十进制)空格:32;0-9:48-57;剩下的就是其他字符了。
#include "stdio.h"
#include "string.h"
#define MAXNUM=100;
int main(){
char str[100]={};
printf("请输入一串字符");
gets(str);
int count1=0,count2=0,count3=0,count=0;
int i=0,num;
while(str[i]!='\0'){
num=str[i]+0;
if(num>97&&num<122){
count++;
}else if(num>=65&&num<=90){
count++;
} else if(num==32) count1++;
else if(num>=48&&num<=57){
count2++;
} else{
count3++;
}
i++;
}
printf("大小写字母个数为:%d\n空格个数为:%d\n字符个数为:%d\n其他字符个数为%d\n",count,count1,count2,count3);
}
程序8】
题目:一个数如果恰好等于它的因子之和,这个数就称为“完数”。例如6=1+2+3.编程找出1000以内的所有完数。
分析:求出其全部因子,然后对其相加看是否为原来的数,注意循环以及sum的赋值
#include "stdio.h"
int main(){
for (int i = 1; i <1000 ; i++) {
int sum=0;
for (int j = 1; j < i; j++) {
if(i%j==0){
sum+=j;
}
}
if(i==sum){
printf("完数:%d",i);
}
}
}
程序9】
题目:一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在第10次落地时,共经过多少米?第10次反弹多高?
分析:前十次走过多少米要加上落地后反弹的距离,减去第十次反弹的距离;注意变量类型,整型可能会数据不精;
#include "stdio.h"
int main(){
float sum=0,heigh=100;
for (int i = 0; i <10; i++) {
sum=sum+heigh+heigh/2;
heigh=heigh/2;
}sum=sum-heigh;
printf("前十次经过%fm\n第十次反弹%fm",sum,heigh);
}
程序10】
题目:猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
#include <stdio.h>
int main() {
int x=1;
for (int i = 1; i <=10 ; i++) {
x=(x+1)*2;
printf("第%d天有%d个桃子\n",10-i,x);
}
}
程序11】
求s=a+aa+aaa+aaaa+aa…a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加有键盘控制。
#include <stdio.h>
// 递归函数,计算 s=a+aa+aaa+aaaa+...+aa...a(共 n 项)
int main() {
int a, n;
printf("请输入数字 a:\n");
scanf("%d", &a);
printf("请输入项数 n:\n");
scanf("%d", &n);
// 计算并输出结果
int sum = 0;
int term = 0;
for (int i = 1; i <= n; i++) {
term = term * 10 + a; // 更新当前项的值
sum += term; // 累加到总和中
}
printf("s 的值为:%d\n", sum);
return 0;
}
程序12】
打印出如下图案(菱形)
分析:通过循环进行打印,严格控制打印位置,通过对其位置的判别,选择是否打印空格还是星号;
#include <stdio.h>
int main() {
int i=0,j=0,sum=0,a=0,b=0;
for (int i = 1; i <8 ; i++) {
for (int j = 1; j <8 ; j++) {
a=i,b=j;
if(a>4) a=8-a;
if(b>4) b=8-b;
sum=a+b;
if(sum>=5) printf("*");
else printf(" ");
}
printf("\n");
}
return 0;
}
程序13】
题目:有一分数序列:2/1,3/2,5/3,8/5,13/8,21/13…求出这个数列的前20项之和。
#include <stdio.h>
int main() {
double i=2,j=1,sum=0;
for (int n = 1; n <=20 ; ++n) {
sum+=i/j;
double tempt=i;
i=i+j;
j=tempt;
}
printf("%f",sum);
return 0;
}
程序14】
题目:求1+2!+3!+…+20!的和
分析:两次循环,第一次循环调用函数,第二次循环是完成阶乘,注意长度,long long int,返回值%lld;
#include <stdio.h>
long long int sumfun(int num)
{
long long int sum=1;
for (int j = 1; j <=num ; j++) {
sum*=j;
}return sum;
}
int main() {
long long int sum=0,num=0;
for (int i = 1; i <=20 ; i++) {
sum+= sumfun(i);
}printf("%lld\n",sum);
return 0;
}
程序15】
题目:利用递归方法求5!
分析:递归关键在于返回值是怎么写,要注意递归公式!
#include <stdio.h>
int sumfun(int num)
{
if(num==1) return 1;
else return num*sumfun(num-1);
}
int main() {
int sum= sumfun(5);
printf("5!的阶乘是%d",sum);
return 0;
}
程序16】
从键盘输入一个字符串,将其中的小写字母全部转换成大写字母,然后输出到一个磁盘文件“test”中保存。输入的字符串以“!”结束
#include<stdio.h>
#include<stdlib.h>
void main(){
FILE *fp;
char ch;
fp=fopen("text.txt","w+");
if(fp ==NULL)
{
printf("Cannot open file strike any key exit!");
exit(1);
}
printf("input the string:");
while(1)
{
scanf("%c",&ch);
if(ch=='!')
break;
if(ch>='a'&&ch<='z')
ch-=32;
fprintf(fp,"%c",ch);
}
fclose(fp);}
程序17】
题目:利用递归函数调用方式,将所输入的5个字符,以相反顺序打印出来。
#include <stdio.h>
void contra_print(char * a);
int main(void)
{
char a[10] = "0";
int i = 0;
printf("请输入一串字符(不含空格):");
scanf("%s",&a);
printf("\r\n输入的一串字符为:");
while(a[i] != '\0')
{
printf("%c",a[i]);
i++;
}
printf("\r\n逆序输出为:");
contra_print(&a[i-1]);
printf("\r\n");
return 0;
}
void contra_print(char * a)
{
if(*a!='\0')
{
printf("%c",*a);
a--;
contra_print(a);
}
else
{
printf(" ");
}
}
程序18】
题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
#include <stdio.h>
int fun(int a){
if(a==1) return 10;
else{
return 2+ fun(a-1);
}
}
int main(void)
{
int x=fun(5);
printf("第五个人的年纪是:%d\n",x);
return 0;
}
程序19】
题目:给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
分析:关键在于逆序输出的逻辑结构。
#include <stdio.h>
int main(void)
{
printf("请输入不大于五位的数:\n");
int x=0,count=0;
scanf("%d",&x);
int a=x;
while(x!=0){
count++;
x=x/10;
}
printf("位数为:%d\n",count);
printf("逆序输出为:");
for(int i = 0; i < 5; i++) {
int digit = a % 10;
printf("%d", digit);
a /= 10;
}
}
程序20】
一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同
分析:对位数求数:
- 获取个位数(A):使用模运算(除以10取余数),A = ABCDE % 10。
- 获取十位数(B):将ABCDE除以10并取整,然后再进行一次模运算(除以10取余数),B = (ABCDE // 10) % 10。
- 获取百位数(C):将ABCDE除以100并取整,然后再进行一次模运算(除以10取余数),C = (ABCDE // 100) % 10。
- 获取千位数(D):将ABCDE除以1000并取整,然后再进行一次模运算(除以10取余数),D = (ABCDE // 1000) % 10。
- 获取万位数(E):将ABCDE除以10000并取整,E = ABCDE // 10000。
#include <stdio.h>
int main(void)
{
printf("请输入不大于五位的数:\n");
int x = 0, count = 0;
scanf("%d", &x);
int a = x;
if(x/10000==x%10&&x/10%10==x/1000%10)
printf("%d是对称的\n", x);
else printf("是不对称的");
}
程序21】
题目:求100之内的素数。
#include <stdio.h>
int is_prime(int num) {
if (num <= 1) {
return 0;
}
for (int i = 2; i * i <= num; i++) {
if (num % i == 0) {
return 0;
}
}
return 1;
}
int main() {
printf("Prime numbers up to 100:\n");
for (int i = 2; i <= 100; i++) {
if (is_prime(i)) {
printf("%d ", i);
}
}
printf("\n");
return 0;
}
程序22】
题目:求一个3*3矩阵对角线元素之和。
分析:主要对二维数组的赋值,首先要初始化,然后scanf内不要妄加地址符
#include <stdio.h>
int main() {
int a[3][3]={0};
int i=0,j=0,sum=0;
printf("请输入一串二维数组");
for (i=0; i <=2 ; i++) {
for (j=0; j <=2; j++) {
scanf("%d",&a[i][j]);
}
}
for (int i = 0; i < 3; i++) {
printf("对角元素为:%-3d",a[i][i]);
sum+=a[i][i];
}
printf("对角元素之和为:\n%d",sum);
}
程序23】
题目:有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
分析:关键在于中间部位的数字插入
#include <stdio.h>
int main() {
int a[] = {1, 2, 4, 6, 7};
int x = 0, len = sizeof(a) / sizeof(a[0]);
printf("请输入要插入的数值:\n");
scanf("%d", &x);
if (x <= a[0]) {
for (int i =len-1 ; i>0; --i) {
a[i] = a[i-1];
}
a[0] = x;
len++;
} else if (x >= a[len - 1]) {
a[len] = x;
len++;
} else {
for (int i = 0; i < len; ++i) {
if (a[i] < x && x < a[i + 1]) {
for (int j = len; j > i + 1; --j) {
a[j] = a[j - 1];
}
a[i + 1] = x;
len++;
break;
}
}
}
printf("插入后的数组为:");
for (int i = 0; i < len; i++) {
printf("%d", a[i]);
}
}
程序24】
题目:将一个数组逆序输出。
#include <stdio.h>
#define n 5
int main() {
int c[n]={0};
printf("请输入一串数字:\n");
for (int i = 0; i < n; ++i) {
scanf("%d",&c[i]);
}
int len=sizeof(c)/sizeof(c[0]);
for (int i =len-1 ; i >=0 ; i--) {
printf("%d ",c[i]);
}
}
程序25】
题目:打印出杨辉三角形(要求打印出10行如下图)
分析:除了边界都是1,内部:a[2][1]=a[1][0]+a[1][1]
#include "stdio.h"
int main()
{int i,j;
int a[10][10];
printf("\n");
for(i=0;i<10;i++)
{a[i][0]=1;
a[i][i]=1;}
for(i=2;i<10;i++)
for(j=1;j<i;j++)
a[i][j]=a[i-1][j-1]+a[i-1][j];
for(i=0;i<10;i++)
{for(j=0;j<=i;j++)
printf("%5d",a[i][j]);
printf("\n");
}
}
程序26】
题目:输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组。
#include "stdio.h"
#define n 5
int main()
{
int num[n]={0};
printf("请输入5个数字,用空格分开\n");
for (int i = 0; i < n; ++i) {
scanf("%d",&num[i]);
}
int max=0,max_id=0;
int min=0,min_id=0;
max=min=num[0];
max_id=min_id=0;
for (int i = 0; i < n; ++i) {
if(max<num[i]){
max=num[i];
max_id=i;
}if(min>num[i]){
min=num[i];
min_id=i;
}
}
printf("数组中的最大数为:%d \r\n",max);
printf("数组中的最小数为:%d \r\n",min);
if(max_id == 0)
{
int temp_min=num[min_id];
num[min_id]=num[n-1];
num[n-1]=temp_min;
}
else if(min_id == 0)//若只第一个数为最小数,则需要注意,最小数交换的是最大数交换后的数
{
//最大的与第一个元素交换
int temp_max=num[max_id];
num[max_id]=num[0];
num[0]=temp_max;
//最小数与最大数的位置进行交换,因为最小数被换到最大数的位置上了
int temp = num[max_id];
num[max_id] = num[n-1];
num[n-1] = temp;
} else {
int temp_max = num[max_id];
num[max_id] = num[0];
num[0] = temp_max;
int temp_min = num[min_id];
num[min_id] = num[n - 1];
num[n - 1] = temp_min;
}
for (int i = 0; i < n; ++i) {
printf("%d ",num[i]);
}
}
题目27】
题目:有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数。
#include "stdio.h"
#define n 4
int main()
{
//printf("请输入n个数(以#结尾):\n");
int a[n]={1,2,3,4};
int b[n]={0};
printf("请输入移动几位:\n");
int m=0;
scanf("%d",&m);
for (int i = 0; i <= n; ++i) {
b[i]=a[(m+i)%n];
}
for (int i = 0; i < n; ++i) {
printf("%d",b[i]);
}
}
题目28】
题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。
#include <stdio.h>
int main() {
int n;
printf("请输入几个人: ");
scanf("%d", &n);
int people[n];
for (int i = 0; i < n; ++i) {
people[i] = 1; // 初始化,1表示此人还在圈子中
}
int count = 0; // 计数器,记录报数
int remain = n; // 剩余人数
int index = 0; // 当前位置
// 循环直到只剩下一个人
while (remain > 1) {
if (people[index] == 1) {
count++; // 报数
if (count %3 == 0) { // 如果报数为3,则此人退出圈子
people[index] = 0; // 0表示此人已退出圈子
remain--; // 圈子中人数减一
}
}
index = (index + 1) % n; // 移动到下一个人
}
// 找到最后留下的人的编号
printf("最后的情况是:");
for (int i = 0; i < n; ++i) {
printf("%d ",people[i]);
}
int survivor = 0;
while (people[survivor] == 0) {
survivor++;
}
printf("\n获胜者是 %d.\n", survivor + 1); // 输出最后幸存的人的编号
return 0;
}
题目29】
题目:写一个函数,求一个字符串的长度,在main函数中输入字符串,并输出其长度。
#include <stdio.h>
#define N 100
int len(char *n){
int len=0;
while (n[len]!='\0'){
len++;
}
return len;
}
int main() {
printf("请输入一串字符串:");
char str[N];
scanf("%s",str);
int c=0;
c=len(str);
printf("长度为:%d",c);
}
题目30】
编写input()和output()函数输入,输出5个学生的数据记录。
分析:输入数据时,对于字符型不需要加&,对其函数的调用时,若char str;则inputfun(&str),若char str[1];则inputfun(str);
#include <stdio.h>
typedef struct {
char name[10];
int age;
char sex[5];
int score;
} student;
void inputfun(student *stu) {
printf("请输入学生的姓名、年龄、性别和成绩(用空格分隔):\n");
scanf("%s %d %s %d", stu->name, &stu->age, stu->sex, &stu->score);
}
void outputfun(student *stu) {
printf("学生信息:\n");
printf("姓名:%s\n", stu->name);
printf("年龄:%d\n", stu->age);
printf("性别:%s\n", stu->sex);
printf("成绩:%d\n", stu->score);
}
int main() {
student stu[1];
inputfun(stu);
outputfun(stu);
return 0;
}
题目31】
冒泡排序
#include <stdio.h>
#define ARR_LEN 255 /*数组长度上限*/
#define elemType int /*元素类型*/
/* 冒泡排序 */
/* 1. 从当前元素起,向后依次比较每一对相邻元素,若逆序则交换 */
/* 2. 对所有元素均重复以上步骤,直至最后一个元素 */
/* arr[]: 排序目标数组; int length: 元素个数 */
void BubbleSort(int arr[], int length)
{
for (int i = 0; i < length; i++)
{
for (int j = 0; j < length - i - 1; j++)
{
if (arr[j] > arr[j + 1])
{
int temp;
temp = arr[j + 1];
arr[j + 1] = arr[j];
arr[j] = temp;
}
}
}
}
int main(void) {
elemType arr[ARR_LEN] = { 3,5,1,-7,4,9,-6,8,10,4 };
int len = 10;
// int len = sizeof(arr) / sizeof(arr[0]); 获取数据长度
int i;
BubbleSort(arr, len);
for (i = 0; i < len; i++)
printf("%d\t", arr[i]);
putchar('\n');
return 0;
}