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
样例输出:
streetmusic
#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