小言_互联网的博客

XJTU_ 西安交通大学2020大学计算机作业-第九周

426人阅读  评论(0)

XJTU_ 西安交通大学2020大学计算机作业-第九周

XJTU_ 西安交通大学2020大学计算机作业-第九周

注:所有题所有用例均已通过。

俺又更新了,还是求点星星👇
文章没上传到github,反正没人点星星:https://github.com/nobodyXX/XJTU_C_homework/blob/main/week7,如果这篇文章带给你了帮助或者灵感,欢迎给我点个星星,谢谢!!!

第一题

"一个数组A中存有n(n>0)个整数,在不允许使用另外数组的前提下,将每个整数,循环向右移m(m>=0)个位置,即将A中的数据由(A0A1……An-1)变换为(An-m…… An-1A0A1……An-m-1)(最后m个数循环移至A的最前面的m个数)。输入n ( 1<=n<=100)、m(m>=0)及n个整数,输出循环右移m位以后的整数序列。

输入:

占二行,其中

第1行输入n和m两个数,n和m之间用空格分隔。

第2行输入数组A中的n个数,数据间用空格分隔。

输出:

占一行,数据间用一个空格分隔。

样例:

10 5

1 2 3 4 5 6 7 8 9 0

样例输入:
1 1
1
样例输出:
1

int main() {
   
	int a[100], m, n;
	scanf("%d %d", &n, &m);
	for (int i = 0; i < n; i++) scanf("%d", &a[i]);
	for (int i = 0; i < m; i++) {
   
		for (int b = 0, c, temp; b < n; b++) (b == 0) ? temp = a[0], a[0] = a[n - 1] : (c = a[b], a[b] = temp, temp = c);//右移一位
	}
	for (int i = 0; i < n; i++) (i == 0) ? printf("%d", a[i]) : printf(" %d", a[i]);
	return 0;
}

第二题

"去掉字符串中的空格。字符串长度不超过200.

输入:带空格的字符串。

输出:不含空格的字符串。

样例:

Washington hosts Chinese folklife festival

WashingtonhostsChinesefolklifefestival

样例输入:
#########!!!
样例输出:
#########!!!

# include<string.h>
int main() {
   
	char a[202], b[202] = "", c[2];
	gets(a);
	int i = strlen(a);
	for (int d = 0; d < i; d++) {
   
		sprintf(c,"%c", a[d]);//把a[d]赋给c,用strcpy报错,应该是没在a找到‘\0’
		(c[0] == ' ') ? 0 : strcat(b, c);
	} 
	puts(b);
	return 0;
}

第三题

"编程,查找同时在第一个数组和第二个数组中的全部元素。

首先输入数组a的元素个数,再输入数组a的各个元素的值,接着输入数组b的元素个数,再输入数组b的各个元素的值,输出同时在两个数组的全部元素。

样例输入:

3

1 2 3

5

1 3 5 7 9

样例输出:

1 3

样例输入:
3
1 2 3
5
1 3 5 7 9
样例输出:
1 3

int main() {
   
	int a[100], b[100], c[100], an, bn, m = 0;
	scanf("%d", &an);
	for (int i = 0; i < an; i++) scanf("%d", &a[i]);
	scanf("%d", &bn);
	for (int i = 0; i < bn; i++) scanf("%d", &b[i]);
	for (int i = 0; i < an; i++) {
   //历遍a
		for (int j = 0; j < bn; j++) //历遍b
			(a[i] == b[j]) ? c[m] = a[i], m++ : 0;//历遍c可避免重复元素
	}
	for (int i = 0; i < m; i++)(i == 0) ? printf("%d", c[i]) : printf(" %d", c[i]);
	return 0;
}

第四题

如果一个数列中的某一段(至少有两个元素)的各元素值均相同,则称之为等值数列段。等值数列段中元素的个数叫做等值数列段的长度。

输入:

序列长度N和N个整数(其中1<=N<=50), 以空格隔开。

输出:

数组中长度最大的等值数列段的始末下标(0~N-1),用英文逗号分隔。如果没有等值数列段,则输出NO.

说明:

如果有多个同等长度的等值数列,只输出第一个等值数列的起止下标。

样例输入:
7 3 1 2 1 1 2 2
样例输出:
3,4

int main() {
   
	int a[50], n = 0, b = -1, c = 0;
	for (char d = ' '; d != '\n'; n++) scanf("%d%c", &a[n], &d);
	for (int i = 2; i < n; i++) {
   
		c = (a[i] == a[i - 1]) ? ((b == -1) ? b = i - 2 : 0) : i - 2;
		if (c != 0 && b != -1 && c != b) break;//第一次等于时c=b,其它c=0,结束时c=i-2
	}
	printf("%d,%d", b, c);
	return 0;
}
//改进版
int main() {
   
	int a[50], n = 0, maxip=0, c=0, b[30] = {
   0};//b记录下标,b[0]和b[1]是第一组。
	for (char d = ' '; d != '\n'; n++) scanf("%d%c", &a[n], &d);
	for (int i = 2; i < n; i++) {
   
		if (a[i] == a[i - 1]) {
   
			(b[c] == 0) ? b[c] = i - 2 : 0;
			b[c + 1] = i - 1;
		}
		else
			c = (b[c + 1] == i - 2) ? c + 2 : 0;
	}
	for (int i = 0, maxlen=b[1]-b[0]; i < 30; i = i + 2) {
   
		maxip = ((b[i + 1] - b[i]) > maxlen) ? i : maxip;
	}
	printf("%d,%d", b[maxip], b[maxip + 1]);
	return 0;
}

第五题

输入一个可能带空格字符的字符串(长度不超过200),统计其中各个英文字母的出现次数,不区分大小写。输出字母a~z的出现次数,数据间以英文逗号分隔。非英文字母不统计。

输入:可能带空格的字符串。

输出:26个整数,以英文逗号分隔。

样例输入:
World’s oldest drink enjoys new success
样例输出:
0,0,2,3,4,0,0,0,1,1,1,2,0,3,3,0,0,2,6,1,1,0,2,0,1,0

#include<string.h>
int main() {
   
	char a[200];
	gets(a);
	int l[26] = {
    0 }, n = strlen(a);
	for (int i = 0; i < n; i++) {
   
		(a[i] >= 97 && a[i] <= 122) ? l[a[i] - 97]++ : 0;
		(a[i] >= 65 && a[i] <= 90) ? l[a[i] - 65]++ : 0;//大写字母也算
	}
	//a的ASCII码是97,A的ASCII码是65
	for (int i = 0; i < 26; i++) (i == 0) ? printf("%d", l[i]) : printf(",%d", l[i]);
	return 0;
}

第六题

从键盘输入一个位数不超过20位的无符号二进制整数,将其转换为十进制。

输入:二进制序列

输出:对应的十进制数

样例输入:
16142
样例输出:
2+7+1153=1162

#include<math.h>
int main() {
   
	long long a = 0, n;
	scanf("%lld", &n);//长长整型占位符%ld
	for (int i = 0; n != 0; n = n / 10, i++) a = a + ((n % 10 == 1) ? pow(2, i) : 0);
	printf("%d", a);
	return 0;
}

第七题

计算级数

2/1, -3/2, 5/3, -8/5,…

的前n项和。

级数的特点是:(1)若先不考虑符号,则前一项的分子是后一项的分母,前一项的分子分母之和为后一项的分子。(2)级数各项的正负号交错。

输入:项数n, 0<n<100.

输出:前n项的和,格式"%f"。

样例输入:
1
样例输出:
2.000000

#include<math.h>
int main() {
   
	float a = 2, b = 1, sum = 0, n;
	scanf("%f", &n);
	for (int i = 0; i < n; i++) {
   
		sum = sum + pow(-1, i)*a / b;
		a = a + b;
		b = a - b;
	}
	printf("%f", sum);
	return 0;
}

第八题

求正整数n的所有因子(1和n除外)的和。例如:n=20时,因子为2、4、5、10 ,它们的和为21。素数的因子和为0。

输入:正整数n。

输出:除1和本身之外的因子的和,整数。

样例输入:
3
样例输出:
0

int main() {
   
	int sum = 0, n;
	scanf("%d", &n);
	for (int i = 2; i < n / 2 + 1; i++) sum = sum + ((n%i == 0) ? i : 0);
	printf("%d", sum);
	return 0;
}

第九题

比较两个字符串的前n个字符,不区分大小写。字符串的长度不超过100。

如果第1个字符串的前n个字符大于第2个字符串的前n个字符,输出1;

如果第1个字符串的前n个字符小于第2个字符串的前n个字符,输出-1;

如果第1个字符串的前n个字符等于第2个字符串的前n个字符,输出0;

字符比较:字母表中后面的大于前面的。

输入:两个字符串和一个正整数。

输出:1、-1或0。

样例输入:
abcxyz abcdef 5
样例输出:
1

int main() {
   
	char a[100], b[100];
	int c = 0, d = 0, n;
	scanf("%s %s %d", a, b, &n);
	for (int i = 0; i < n; i++) {
   
		c = c + ((a[i] < 97) ? a[i] + 32 : a[i]);//大写转小写
		d = d + ((b[i] < 97) ? b[i] + 32 : b[i]);
	}
	(c == d) ? printf("0") : printf("%d", (c > d) ? 1 : -1);
	return 0;
}

第十题

将字符串首部的号全部移到字符串的尾部,中间若有号,保持中间的*号不动。字符串长度不超过200.

样例:

streetmusic*

streetmusic*

样例输入:
streetmusic
样例输出:
stree
tmusic

#include<string.h>
int main() {
   
	char a[100], b[100] = "", c[2], d[2]="*";
	gets(a);
	int i = 0, l = strlen(a);
	for (; a[i] == '*'; i++);//*数量
	for (int j = i; j < l; j++) {
   //复制余下字符到b
		sprintf(c, "%c", a[j]);
		strcat(b, c);
	}
	for (int j = 1; j <= i; j++) strcat(b, d);
	puts(b);
	return 0;
}

第十一题

输入两个整型数组(假设数组的大小为不超过10)的各个元素,输出不是两个数组共有的元素,并从小到大排序输出。

输入:两个数组的元素(小于10个),数组中第一个数据指示元素的个数.

输出:两个数组的元素中非共有的元素,并且从小到大进行排序.

样例输入:
7 1 2 3 4 5 6 7 6 5 6 7 8 9 0
样例输出:
0 1 2 3 4 8 9

这个代码写的很不怎么样

int w9_q11_pd(int p[11], int q[11], int w[20], int n, int m, int wn) {
   //m是另一个数组的长度
	for (int i = 0, f1 = -1, f2 = 1; i < n; i++, f1 = -1,f2=1) {
   //f1判断p[i]是否在q内
		for (int j = 0; j < m; j++) {
   
			if (p[i] == q[j]) break;
			if (p[i] != q[j] && j == m - 1) f1 = 1;
		}
		for (int j = 0; j < wn; j++) //f2判断p[i]是否与w中元素重复
			if (p[i] == w[j]) f2=-1;
		(f1 == 1&&f2==1) ? w[wn] = p[i], wn++ : 0;//把p有q没有的数赋给w[wn]
	}
	return wn;//wn是c[]内有几个数
}
int week9_q11() {
   //这个代码写的麻烦了,理解错题意了
	//输入7 1 2 3 4 5 6 7 6 5 6 7 8 9 0,第一个数组7位,第二个6的意思是第二个数组有六位
	int a[11], b[11], n1,n2, c[20];//n1是a的长度,n2是b的长度
	//a,b是输入的两个数组,c存储两数组不同的数字
	scanf("%d", &n1);
	for (int i = 0; i < n1; i++) scanf("%d", &a[i]);
	scanf("%d", &n2);
	for (int i = 0; i < n2; i++) scanf("%d", &b[i]);//两个数组的长度不一定都是n
	int wn = w9_q11_pd(a, b, c, n1, n2, 0);
	wn = w9_q11_pd(b, a, c, n2, n1, wn);//wn记录c数字个数
	int max = c[0], min = c[0];
	for (int i = 1; i < wn; i++) {
   //排序太麻烦,就不写了
		max = (c[i] > max) ? c[i] : max;
		min = (c[i] < min) ? c[i] : min;
	}
	for (int i = min, f = 0; i <= max; i++) {
   
		for (int j = 0; j < wn; j++) (i == c[j]) ? ((f == 0) ? printf("%d", i), f = 1 : printf(" %d", i)) : 0;
	}
	return 0;
}

第十二题

输入任意长度的字符串,分别统计其中大写字母,小写字母,数字字符及其它字符的个数并输出统计结果,再按统计值从多到少依次输出。

提示:测试用例输出的冒号是中文冒号。

输入:任意长度的字符串。

输出:统计其中大写字母,小写字母,数字字符及其它字符的个数。

样例输入:
ASDFghjkl*(),;19
样例输出:
大写字母:4 小写字母:5 数字字符:2 其它字符:5 从多到少依次输出如下: 小写字母:5 其它字符:5 大写字母:4 数字字符:2

自认为这个写得不错

int w9_q12_print(int i, int a[4]) {
   
	switch (i){
   
	case 0:
		printf(" 大写字母:%d", a[0]);
		break;
	case 1:
		printf(" 小写字母:%d", a[1]);
		break;
	case 2:
		printf(" 数字字符:%d", a[2]);
		break;
	case 3:
		printf(" 其它字符:%d", a[3]);
		break;
	}
}

int main() {
   
	int a[4] = {
    0 }, n, b[4] = {
    0 }, max = 0;
	char s[1000];
	gets(s);
	n = strlen(s);
	for (int i = 0; i < n; i++) {
   
		if (s[i] >= 65 && s[i] <= 90)a[0]++;
		else if (s[i] >= 97 && s[i] <= 122)a[1]++;
		else if (s[i] >= 48 && s[i] <= 57)a[2]++;
		else a[3]++;
	}
	printf("大写字母:%d 小写字母:%d 数字字符:%d 其它字符:%d", a[0], a[1], a[2], a[3]);
	printf(" 从多到少依次输出如下:");
	for (int i = 0; i < 4; i++) max = (a[i] > max) ? a[i] : max;
	for (int j = max; j >= 0; j--) {
   
		for (int i = 0; i < 4; i++) {
   
			if (a[i] == j) w9_q12_print(i, a);
		}
	}
	return 0;
}

第十三题

从键盘输入一个正整数(>1),然后将该整数分解为1和各个质因子的相乘,如果输入的整数本身就是质数,则应分解为1和该数本身相乘。

样例输入:
18
样例输出:
123*3

int week8_q13() {
   //用第六题的代码改一改就好
	int n, s = 0;
	scanf("%d", &n);
	for (int i = 2, w = 0, b = n; n != 1; i++, w = 0) {
   
		for (int a = 2; a <= i / 2 + 1; a++) {
   //判断i是否为质数,是的话w=1
			if (i%a != 0 || i == 2)(a == i / 2 + 1) ? w = 1 : 0;
			else break;
		}
		if (w == 1 && n%i == 0) {
   
			if (i == b)printf("1*%d",n), n = 1;//n是质数输出0
			else {
   
				(n == b) ? printf("1*%d", i) : printf("*%d", i);
				n = n / i, s = s + i;
				i = 1;//从头再来,后边还要执行i++
			}
		}
	}
	return 0;
}

第十四题

从键盘输入两个正整数m和n,然后从m+1开始找出大于m的n个素数。

输入:m,n

输出:n个素数,数据间以一个空格分隔。

样例输入:
1 20
样例输出:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71

int main() {
   
	int m, n;
	scanf("%d %d", &m, &n);
	for (int a = m + 1, b = 0; b < n; a++) {
   
		for (int i = 2; i <= a; i++) {
   
			if (a%i == 0 && i != a) break;
			if (i == a) {
   
				(b == 0) ? printf("%d", a) : printf(" %d", a);
				b++;
			}
		}
	}
	return 0;
}

第十五题

所谓孪生素数是指间隔为 2 的相邻素数,例如最小的孪生素数是3和5,5和7也是孪生数。

编写程序,求给定区间[m,n]中的孪生数的数量。例如[2,10]中的孪生数有(3,5)和(5,7),则[2,10]中孪生数的数量为2.

输入:正整数m,n,    m,n>1.

输出:[m,n]中的孪生的数量

样例输入:
2 100
样例输出:
8

int main() {
   
	int m, n, count = 0;
	scanf("%d %d", &m, &n);
	for (int a = m, b = -1; a <= n; a++) {
   
		for (int i = 2; i <= a; i++) {
   
			if (a%i == 0 && i != a) break;
			if (i == a) {
   
				(a - b == 2) ? count++ : 0;
				b = a;
			}
		}
	}
	printf("%d", count);
	return 0;
}

都看到这儿了,点个星星呗https://github.com/nobodyXX/XJTU_C_homework/blob/main/week7


转载:https://blog.csdn.net/weixin_44687093/article/details/109713100
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场