C语言OJ题—xjtu大计基作业第八周
/*输入若干个整数,其值在0至4的范围内,用-1作为输入结束的标志,统计每个整数的个数。
输入:[0,4]内的整数组成的序列,最后是-1,用空格隔开。
输出:0,1,2,3,4的统计个数,用一个空格隔开。*/
#include<stdio.h>
int main()
{
int a = 0, m = 0, n = 0, o = 0, p = 0, q = 0;
do
{
scanf_s("%d", &a);
if (a >= 0 && a <= 4)
{
switch (a)
{
case 0:
m++;
break;
case 1:
n++;
break;
case 2:
o++;
break;
case 3:
p++;
break;
case 4:
q++;
break;
}
}
} while (a != -1);
printf("%d %d %d %d %d", m,n,o,p,q);
}
/*将一个大于4的正整数分解为连续的正整数之和,请显示全部分解结果。
如数字15,可以分解为:
15=1+2+3+4+5
15=4+5+6
15=7+8*/
#include<stdio.h>
int main()
{
int num;
scanf_s("%d", &num);
int sum = 0;
int d;
for (int i = 1; i <= num/2; i++)
{
for (int j = 1;; j++)
{
sum = (j + 1) * (2 * i + j) / 2;
if(sum>num)
break;
if (sum == num)
{
printf("%d=", num);
for (int k = 0; k < j; k++)
{
d = i + k;
printf("%d+", d);
}
printf("%d\n", i + j);
}
}
}
return 0;
}//这里用的循环次数较高;可以考虑优化算法减少复杂度;
/*求a+aa+aaa+aaaa+…+aa...a(n个),其中a为1~9之间的整数。
例如:当a = 1, n = 3时,求1+11+111之和为123;
输入:组成序列的数字a和求和项的数量n
输出:算式和结果。*/
#include<stdio.h>
int main()
{
int s = 0, a, n, t;
scanf_s("%d %d", &a, &n);
t = a;
while (n > 1)
{
printf("%d+", t);
s += t;
a = a * 10;
t += a;
n--;
}
printf("%d", t);
s += t;
a = a * 10;
t += a;
printf("=%d", s);
return 0;
}
/*“水仙花数”是指一个三位正整数,其各位数字的立方和刚好等于该数本身,如:153=1^3+5^3+3^3 (其中^表示乘方,5^3表示5的3次方),则153是一个“水仙花数”。
输入n, m,100<=n,m<1000, 求出[n,m]之间的水仙花数。若该区间没有水仙花数,输出-1.
输入:n,m,用空格隔开。
输出:若干水仙花数,用空格隔开。*/
#include<stdio.h>
#include<math.h>
int main()
{
int a, b
int c, d, e;
int sum = 0;
int f = -1;
int flag = 1;
scanf_s("%d%d", &a,&b);
for (int i = a; i <= b; i++)
{
c= i / 100;
d = i / 10 - c * 10;
e = i % 10;
if (c * c*c + d * d*d + e * e*e == i)
{
if (flag)
flag = 0;
else
printf(" ");
printf("%d", i);
sum++;
}
}
if (sum == 0)
printf("%d",f);
return 0;
}
/*求一组数中的最大值,然后统计该最大值在这组数中出现的次数。
输入:元素个数n和n个整数。n<200。(要先输入个数n,然后再输入n个数)
输出:最大值及出现的次数。数据间以一个逗号隔开。*/
#include<stdio.h>
#include<stdlib.h>
int main()
{
int n;
scanf_s("%d", &n);
//getchar();
int *sz;
sz = (int*)(malloc(n * sizeof(int)));
int sum = 0;
int max = 0;
for (int i = 0; i < n; i++)
{
scanf_s("%d", &sz[i]);
//getchar();
}
for (int i = 0; i <n; i++)
{
if (sz[i] >= max)
max = sz[i];
}
for (int i = 0; i < n; i++)
{
if (sz[i] == max)
sum++;
}
printf("%d,%d",max,sum);
//free(sz);
return 0;
}
/*定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词,按字典顺序寻找最大和最小单词并输出。
输入:5个单词
输出:最大和最小单词(按字典序)*/
#include<stdio.h>
#include<string.h>
int main() {
char a[6][20];
for (int i = 0; i < 5; i++)
scanf(" %s", a[i]);
//通过冒泡排序法将五个字母按照字典排序即可;
for (int i=0;i<5;i++)
for(int j=0;j<5-1-i;j++)
if (strcmp(a[j], a[j + 1])>0) {
strcpy(a[5], a[j]);
strcpy(a[j], a[j+1]);
strcpy(a[j+1], a[5]);
}
printf("max:%s min:%s", a[4], a[0]);
return 0;
}
/*将字符串首部的*号全部移到字符串的尾部,中间若有*号,保持中间的*号不动。字符串长度不超过200.
样例:
***street*****music***
street*****music*******/
#include <stdio.h>
void main(){
char c[81],*p;
int n=0,i=0;
p=c;
gets(c);
while(*p=='*'){
n++; //统计字符串中前导*号的个数
p++;
}
while(*p){
c[i]=*p; //把前导*号之后的字符全部前移
i++;
p++;
}
while(n!=0){ //把统计*号个数补到字符串的末尾
c[i]='*';
i++;n--;
}
c[i]='\0';
puts(c);
}
/*从键盘输入一个正整数(>1),然后将该整数分解为1和各个质因子的相乘,如果输入的整数本身就是质数,则应分解为1和该数本身相乘。
如:
18
1*2*3*3*/
#include<stdio.h>
int main()
{
int x, i;
scanf_s("%d", &x);
printf("1");
for (i = 2; i * i <= x; i++)//当i*i大于x,明显不再是质因子;
for (; x % i == 0; x /= i)//先判断i是否是x的质因子,再将x除以i的值赋予x;再输出质因子的乘积形式
printf("*%d", i);
if (x > 1)printf("*%d", x);//如果x不是质数的话,x最终值为1;
printf("\n");
return 0;
}
/*有一分数序列如下: 2/1, 3/2, 5/3, 8/5, 13/8, 21/13, … 即后一项的分母为前一项的分子,后项的分子为前一项分子与分母之和,求其前n项之和。
输入:项数n(整数)
输出:前n项之和(实数,注:保留4位小数)*/
#include <stdio.h>
int main()
{
int i, n ;
scanf_s("%d",&n);
double a = 2, b = 1, s = 0, t;
for (i = 1; i <= n; i++)
{
s = s + a / b;
t = a,
a = a + b,
b = t;
}
printf("%.4f", s);
return 0;
}
/*定义包含5个英文单词的字符数组(即二维字符数组),键盘输入5个单词,按字典顺序寻找最大和最小单词并输出。
输入:5个单词
输出:最大和最小单词(按字典序)
如:
one two three four five
max:two min:five(注:max和min后是英文冒号)
*/
/*输入公元年份和月份,输出该月份的天数。
输入:年,月(逗号分隔)
输出:天数
样例输入:
2018,8
样例输出:
31*/
#include<stdio.h>
int main()
{
int year, month;
scanf_s("%d,%d", &year,&month);
if ((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
{
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
{
printf("31");
}
else if (month == 2)
{
printf("29");
}
else if (month == 4 || month == 6 || month == 9 || month == 11)
{
printf("30");
}
}
else
{
if (month == 1 || month == 3 || month == 5 || month == 7 || month == 8 || month == 10 || month == 12)
{
printf("31");
}
else if ( month == 4 || month == 6 || month == 9 || month == 11)
{
printf("30");
}
else if (month == 2)
{
printf("28");
}
}
return 0;
}//可以使用switch内部镶嵌一个if语句,简化结构;
希望大家有什么意见和纠正可以指出,好的解法也可以多多交流。