C语言OJ题—xjtu大计基作业第十一周
/*编写函数,去掉一个字符串中除头部和尾部空格外的所有空格,并编写主函数进行调用测试。
输入:
占一行(注:输入的字符串长度不会超过80)
输出:
占一行*/
#include<stdio.h>
#include<string.h>
int reTodec(char* str);
main() {
char str[80];
gets(str);
reTodec(str);
printf("%s", str);
}
reTodec(char* str) {
char str1[80] = {0};
int i = 0;
int j = 0;
while (str[i]==' ')//头部空格保存
{
str1[i] = str[i];
i++;
}
for ( i,j=i; i <strlen(str); i++)//两个变量的for循环,因为一个是str一个是str1
{
if (str[i] != ' ')
{
str1[j]=str[i];
j++;
}
}
while (str[i-1] == ' ')//尾部空格保存
{
str1[j] = str[i-1];
j++;
i--;
}
strcpy(str, str1);
}
/*"写出正整数的三位分节格式。如,当用户输入82668634时,程序应该输出82,668,634。
输入:正整数
输出:三位分解格式。
样例:
82668634
82,668,634*/
//利用整数字节的范围,三种情况,枚举即可;
#include<stdio.h>
int main()
{
int n;
scanf("%d",&n);
int a, b, c;
if (n / 1000000 > 0)
{
a = n % 1000;
b = n / 1000000;
c = n / 1000 % 1000;
printf("%d,%d,%d", b, c, a);
}
else if (n / 1000 > 0)
{
a = n % 1000;
b = n / 1000;
printf("%d,%d", b, a);
}
else
{
printf("%d", n);
}
return 0;
}
/*将字符串中奇数下标(从0开始)的字符顺序颠倒。如字符12345678,结果为18365472
输入:字符串,不含空格。
输出:结果字符串。*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
int main()
{
char a[201], temp, b[201];
gets(a);
int i = 1, len = strlen(a);
strcpy(b, a);
if (len % 2 == 0)
{
for (; i < (len - 1) / 2; i = i + 2)
{
b[i] = a[len - i];
b[len - i] = a[i];
}
}
else {
for (; i < (len - 1) / 2; i = i + 2)
{
b[i] = a[len - 1-i];
b[len - 1 - i] = a[i];
}
}
puts(b);
return 0;
}
/*输入一个长度不超过 100 的字符串,删除串中的重复字符。
输入:
输入要检查的字符串,长度不超过100个字符。例如:abacaeedabcdcd。
输出:
删除重复字符后的字符串。例如:abced。*/
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void delete(char*sz, int n)
{
int len = strlen(sz);
for (int i = n - 1; i < len; i++)
{
*(sz + i) = *(sz + i + 1);
}
*(sz + len) = '\0';
}
void dele(char* sz)
{
int i = 0;
int j = 1;
while (sz[i]!= '\0')
{
j = i+1;
while (sz[j]!= '\0')
{
if (sz[j]==sz[i])
{
delete(sz,j+1);
}
else
{
j++;
}
}
i++;
}
}
int main()
{
char sz[80];
gets(sz);
dele(sz);
puts(sz);
return 0;
}
/*编写程序,输入字符串到字符数组s中,再输入一个字符给变量c,判断s中是否有c,若有则将该字符从s中删除后输出。若没有,则输出字符串“NotFound”。
输入2行,1个字符串和1个字符:
输出:删除后的字符串
样例1:
输入:
smiles
s
输出:
mile
样例2:
输入:
smiles
a
输出:
NotFound*/
#include<stdio.h>
#include<string.h>
void del(char* str, char c) //str指针指向str数组
{
char*p = str;
while (*str)
{
if (*str != c)
*p++ = *str;
str++;
}
*p = '\0';
}
int main()
{
char str[80], c;
gets(str);
char str1[80];
strcpy(str1, str);
c = getchar();
del(str, c);
if (strcmp(str, str1) == 0)
printf("NotFound");
else
printf("%s", str);
return 0;
}
/*"输入两个字符串,统计第2个字符串(至少含2字符)在第1个字符串中出现的次数。没有出现,次数为0.
输入:两个字符串,以空格分隔。
输出:出现次数,整数。
样例1:
banana an
2
样例2:
bnnnn nn
3*/
int main() {
char a[200], b[100];
scanf("%s", a);
scanf("%s", b);
int count = 0;
for (int i = 0; a[i] !='\0'; i++) {
if (a[i] == b[0]) {
for (int j = 0; b[j] != '\0'; j++, i++) {
if (a[i] != b[j])break;
if (b[j + 1] == '\0')count++,i--;//和第一个循环i++抵消
}
}
}
printf("%d", count);
return 0;
}
/*输入字符串,字符串中有若干星号*,去掉字符串首尾的星号(*),保留中间的星号。 字符串长度不大于200.
输入:带有*号的字符串。
输出:首尾不带*号的字符串。
样例:
***street**music****
street**music
*/
#include<string.h>
#include<stdio.h>
void week11_q1_def1(char* a, int* b) {
int l = strlen(a);
for (int i = 0; a[i] == '*'; b[0]++, i++);
for (int i = l - 1; a[i] == '*'; b[1]++, i--);
}
int main() {
char a[100];
gets(a);
int b[2] = { 0 };
week11_q1_def1(a, b);
for (int i = b[0]; i < strlen(a) - b[1]; i++) printf("%c", a[i]);
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]中的孪生的数量*/
#include<stdio.h>
#include<math.h>
#include<time.h>
int isprime(int num)
{
if (num < 2)
return 0;
for (int i = 2; i <= sqrt(num); i++)
{
if (num % i == 0)
return 0;
}
return 1;
}
int main()
{
int n, m, i, k, l, j;
while (scanf("%d %d",&n,&m))
{
k = 0;
for (i = 2; (i + 2) <= n; i++)
{
if (isprime(i) && isprime(i + 2))
{
k++;
}
}
//printf("%d", k);
l = 0;
for (i = 2; (i + 2) <= m; i++)
{
if (isprime(i) && isprime(i + 2))
{
l++;
}
}
//printf("%d", l);
printf("%d", l - k);
break;
}
return 0;
}
/*从键盘输入一个32位的二进制形式的IP地址,将其转换为点分十进制的表示,如果输入的字符串中含有1和0以外的字符,则输出“该字符串不是正确的IP地址”。
输入:0、1二进制序列,不会超过32位,位数不足时程序自动在前面补0.
输出:点分IP地址。
*/
#include<stdio.h>
#include<string.h>
int check(char* str)
{
int i, sum = 0;
for (i = 0; i < 32; i++)
if (str[i] == '1' || str[i] == '0')
sum++;
if (sum == 31)
return 1;
else
return 0;
}
int trans(char* str)
{
int n = 0, i;
for (i = 0; i < 8; i++)
{
if (str[i] == '1')
n = n * 2 + 1;
else
n = n * 2;
}
return n;
}
int main()
{
char IP[33];
gets(IP);
if (strlen(IP) != 32)
{
int len = strlen(IP);
int d = 32 - len;
for (int i = 32; i >= d; i--)
IP[i] = IP[i - d];
for (int i = 0; i < d; i++)
IP[i] = '0';
// printf("%d.%d.%d.%d", trans(IP), trans(IP + 8), trans(IP + 16), trans(IP + 24));
}
if (check(IP))
printf("该字符串不是正确的IP地址");
else
{
//四次调用trans()分别转换四组二进制数
printf("%d.%d.%d.%d", trans(IP),trans(IP + 8),trans(IP + 16),trans(IP + 24));
}
return 0;
}
/*在医院打点滴(吊针)的时候,如果滴起来有规律,先是滴一滴,停一下;然后滴二滴,停一下;再滴三滴,
停一下...,现在有一个问题:这瓶盐水一共有v毫升,每一滴是d毫升,每一滴的速度是一秒
(假设最后一滴不到d毫升,则花费的时间也算一秒),停一下的时间也是一秒,这瓶水什么时候能滴完呢?
(0 < d < v <6000)
输入:一滴是多少毫升和一瓶盐水有多少毫升,中间用空格隔开.
输出:滴完需要多少时间.*/
#include <stdio.h>
int main()
{
double d, vul;
int t;
int i;
while (~scanf("%lf %lf", &d, &vul))
{
t = 0;
i = 1;
while (vul > 0) {
for (int j = 0; j < i && vul>0; j++) {
vul -= d;
t++;
}
i++;
if (vul > 0)
t++;
}
printf("%d", t);
break;
}
return 0;
}