个人水平有限,只是和大家分享自己的想法和思路,希望大家多批评指正
1.
输入若干个整数,其值在0至4的范围内,统计每个整数的个数。
输入:[0,4]内的整数组成的序列,用空格隔开,以-1终止。
输出:0,1,2,3,4的统计个数,用一个空格隔开(最后一个输出后面没有空格)。
样例:
3 3 3 2 2 1 0 3 4 4 -1
1 1 2 4 2
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//最简单也是最笨的方法,一个一个比较
int main()
{
int a[100]; int i = 0;
do
{
scanf("%d", &a[i]);
i++;
} while (a[i-1] != -1);
int zero = 0, one = 0, two = 0, three = 0, four = 0;
for (int m = 0; m <= i; m++)
{
if (a[m] == 0)
zero++;
if (a[m] == 1)
one++;
if (a[m] == 2)
two++;
if (a[m] == 3)
three++;
if (a[m] == 4)
four++;
}
printf("%d %d %d %d %d\n", zero, one, two, three, four);
return 0;
}
2.
将一个大于4的正整数分解为连续的正整数之和,请显示全部分解结果。
如数字15,可以分解为:
15=1+2+3+4+5
15=4+5+6
15=7+8
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x;
do
{
scanf("%d", &x);
} while (x <= 4);
int i = 1;
for (i; i < x; i++)//i为起点
{
int j = i, adds = 0, o = 0;//o储存已加数字个数
do
{
adds = adds + j;
j++;
o++;
if (adds == x)
{
if (o != 2)//o最少都要2个
{
printf("%d=%d", x, i);
int t = i + 1;
do
{
printf("+%d", t);
t++;
} while (t < j - 1);
printf("+%d\n", j - 1);
}
else
printf("%d=%d+%d\n", x, i, i + 1);
}
} while (j < x);
}
return 0;
}
3.求a+aa+aaa+aaaa+…+aa...a(n个),其中a为1~9之间的整数。
例如:当a = 1, n = 3时,求1+11+111之和为123;
输入:组成序列的数字a和求和项的数量n
输出:算式和结果。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
/*基本思路:类似于
aaaaaaaaaa
aaaaaaaaa
aaaaaaaa
aaaaaaa
aaaaaa
aaaaa
aaaa
aaa
aa
a
将其如此排列,可见其各数位个数呈递减趋势
可将其按个位n个,十位n-1个,百位n-2个···直到加完*/
int main()
{
int a, n, i = 1;
scanf("%d%d", &a, &n);
long long int sum=0;
int t = n;
do //计算和的值
{
sum = sum + t * i * a;//按位加和
i = 10 * i;//i是个十百千万的位
t = t - 1;//t标志还剩几位没加
} while (t != 0);
i = 1;
printf("%d", a);
if (n != 1)
{
for (int o = 2; o <= n; o++)
{
int middle = a;
do //算中间值
{
i = 10 * i;
middle = middle + i * a;
} while (i != pow(10, o - 1));
i = 1;
printf("+%d", middle);
}
}
printf("=%d\n", sum);
return 0;
}
4.“水仙花数”是指一个三位正整数,其各位数字的立方和刚好等于该数本身,如:153=1^3+5^3+3^3 (其中^表示乘方,5^3表示5的3次方),则153是一个“水仙花数”。
输入n, m,100<=n,m<1000, 求出[n,m]之间的水仙花数。若该区间没有水仙花数,输出-1.
输入:n,m,用空格隔开。
输出:若干水仙花数,用空格隔开(最后一位输出后面无空格)。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<math.h>
int main()
{
int n, m;
do {
scanf("%d%d", &n, &m);
} while (n < 100 || m >= 1000);
int f, s, t;//分别存放三位数
int daffodil[20];//存放水仙花数的数组
int i = 0;//计数变量
for (int x = n; x <= m; x++)
{
int a = x;
t = a % 10;//个位
a = a / 10;
s = a % 10;//十位
a = a / 10;
f = a % 10;//百位
if (x == pow(f, 3) + pow(s, 3) + pow(t, 3))
{
daffodil[i] = x;
i++;
}
}
int j = 0;
if (i == 0)//如果没有daffodil输出-1
printf("-1\n");
else if (i != 1)
{
do//按顺序输出daffodil
{
printf("%d ", daffodil[j]);
j++;
} while (j < i - 1);
printf("%d\n", daffodil[j]);
}
else
printf("%d\n", daffodil[0]);
return 0;
}
5.
求一组数(整数数组)中的最大值,然后统计该最大值在这组数中出现的次数。
输入:元素个数n和n个整数。n<200。(要先输入个数n,然后再输入n个数)
输出:最大值及出现的次数。数据间以一个逗号隔开。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n;
scanf("%d", &n);
int figure[200];
int i = 0;
do//输入n个整数
{
scanf("%d", &figure[i]);
i++;
} while (i < n);
int a = 0;
int max = figure[a];
for(a;a<n;a++)//寻找最大值
{
if(max<figure[a])
max=figure[a];
}
int t = 0;
i = 0;
do//max出现次数
{
if (figure[i] == max)
t++;
i++;
} while (i < n);
printf("%d,%d\n", max, t);
return 0;
}
6.
定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词(一个单词最多80个字符),按字典顺序寻找最大和最小单词并输出。
输入:5个单词
输出:最大和最小单词(按字典序)
如:
one two three four five
max:two min:five(注:max和min后是英文冒号)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
int i = 0;
char words[5][80];//二维字符串
for (i = 0; i < 5; i++)
{
scanf("%s", &words[i]);
}
char max[80], min[80];
strcpy(max, words[0]);//字符串复制函数
strcpy(min, words[0]);
i = 0;
for (i; i < 5; i++)
{
if (strcmp(max, words[i]) < 0)/*字符串比较函数,相同返回0,前面更小返回负整数,前面更大返回负整数*/
strcpy(max, words[i]);
if (strcmp(min, words[i]) > 0)
{
strcpy(min, words[i]);
}
}
printf("max:%s min:%s\n", max, min);
return 0;
}
7.
将字符串首部的*号全部移到字符串的尾部,中间若有*号,保持中间的*号不动。字符串长度不超过200.
样例:
***street*****music***
street*****music******
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
int main()
{
int len, i, n;
char a[200] = { 0 };
gets(a);//字符串输入函数
len = strlen(a);
i = 0;
n = 0;
do//确定头部*数量
{
if (a[i] == '*')
{
n++;
i++;
}
} while (a[i] == '*');
int t = n;
while (n!=0)//删除头部*,当然还有其他做法
{
for (i = 0; i < len; i++)
{
a[i] = a[i + 1];
}
n--;
}
i = len - t;
for(i;i<len;i++)//末尾加上**
{
a[i] = '*';
}
puts(a);
return 0;
}
8.
从键盘输入一个正整数(>1),然后将该整数分解为1和各个质因子的相乘,如果输入的整数本身就是质数,则应分解为1和该数本身相乘。
如:
18
1*2*3*3
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int x;
do
{
scanf("%d", &x);
} while (x <= 1);
printf("1");//质因子必有1
int i = 2;//从小开始,因为小的质数为因子就不出现非质的更大的数为因子的情况
for (i; i <= x; i++)//注意循环条件
{
if (x % i == 0)//若是因数
{
printf("*%d", i);
x /= i;
i--;//再次判断i是否为新x的因子
}
}
return 0;
}
9.有一分数序列如下: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, … 即后一项的分母为前一项的分子,后项的分子为前一项分子与分母之和,求其前n项之和(从第1项算起)。
输入:项数n(整数)
输出:前n项之和(实数,注:保留4位小数)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main()
{
int n;
float sum=0;
scanf("%d", &n);
float s = 2, m = 1, temp;
for (int i = 0; i < n; i++)
{
sum = sum + s/m;
temp = s;
s = m + s;//按题设要求改变分子分母
m = temp;
}
printf("%.4f\n", sum);//%m.n表示占m格,小数点后保留n位
//%m是右对齐,左补空格;%-m是左对齐,右补空格
return 0;
}
10.输入公元年份和月份,输出该月份的天数。
输入:年,月(逗号分隔)
输出:天数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//注意闰年是年份能被4整除且不被100整除
//或者能被400整除的年份
int main()
{
int year, month;
scanf("%d,%d", &year, &month);
int run = 0;//闰年的标志
if (year % 4 == 0 && year % 100 != 0)
run = 1;
if (year % 400 == 0)
run = 1;
int i = month;
if (i == 1 || i == 3 || i == 5 || i == 7 || i == 8 || i == 10 || i == 12)
printf("31\n");
else if (i == 2 && run == 1)
printf("29\n");
else if (i == 2 && run == 0)
printf("28\n");
else
printf("30\n");
return 0;
}