1.字符串的倒置
将一句话的单词进行倒置,标点不倒置。比如 "I like beijing.",经过处理后变为:"beijing. like I"。
字符串长度不超过100。
输入描述:输入一个仅包含小写字母、空格、'.' 的字符串,长度不超过100。'.' 只出现在最后一个单词的末尾。
输出描述:依次输出倒置之后的字符串,以空格分割。
#include<stdio.h>
void reserve(char* left, char* right)
{
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[101] = { 0 };
gets(arr);
char* p = arr;
char* start = arr;
char* end = arr;
while (*p)
{
while (*end!= ' '&&*end!='\0')
{
end++;
}
reserve(start, end-1);
start = end+1 ;
p = end;
if (*end == '\0')
end = end - 1;
else
end = end + 1;
}
reserve(arr, p - 1);
printf("%s\n", arr);
return 0;
}
2.判断有序序列
#include<stdio.h>
int main()
{
int N = 0;
int arr[101] = { 0 };
scanf("%d", &N);
int i = 0;
int count1 = 0;
int count2 = 0;
for (i = 0; i < N; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < N - 1; i++)
{
if (arr[i] - arr[i + 1] >= 0)
{
count1++;
}
else if (arr[i] - arr[i + 1] <= 0)
{
count2++;
}
}
if (count1 == N - 1 || count2 == N - 1)
printf("sorted\n");
else
printf("unsorted\n");
return 0;
}
3.打印菱形
可以分为上下两个部分分别打印。
#include<stdio.h>
int main()
{
int i = 0;
int n = 0;
int j = 0;
scanf("%d", &n);
for (i = 0; i < n; i++)
{
for ( j = 0; j < n -i- 1; j++)
{
printf(" ");
}
for (j = 0; j < 2 * i + 1; j++)
{
printf("*");
}
printf("\n");
}
for (i = 0; i < n-1; i++)
{
for (j = 0; j < i + 1; j++)
{
printf(" ");
}
for (j = 0; j <2*(n-i-1)-1 ; j++)
{
printf("*");
}
printf("\n");
}
return 0;
}
4.打印水仙花数
求出0~100000之间的所有“水仙花数”并输出。
“水仙花数”是指一个n位数,其各位数字的n次方之和确好等于该数本身,如:153=1^3+5^3+3^3,则153是一个“水仙花数”。
#include<stdio.h>
#include<math.h>
int main()
{
long n = 0;
int count = 1;
int ret = 0;
int a = 0;
int b = 0;
for (n = 1; n < 100000; n++)
{
a = n;
b = n;
count = 1;
ret = 0;
while (a/=10)
{
count++;
}
while (b)
{
ret += (int)pow(b % 10, count);
b /= 10;
}
if (ret == n)
{
printf("%d ", n);
}
}
return 0;
}
5.喝汽水问题
喝汽水,1瓶汽水1元,2个空瓶可以换一瓶汽水,给20元,可以多少汽水(编程实现)。
思路图解:其实代码不难,难得是思路不好想。
int main()
{
int n = 0;
scanf("%d", &n);
int sum = n;
while (n > 1)
{
sum += (n / 2);
n = n / 2 + n % 2;
}
printf("%d\n", sum);
return 0;
}
6.变种水仙花数
变种水仙花数 - Lily Number:把任意的数字,从中间拆分成两个数字,比如1461 可以拆分成(1和461),(14和61),(146和1),如果所有拆分后的乘积之和等于自身,则是一个Lily Number。
例如:655 = 6 * 55 + 65 * 5 1461 = 1*461 + 14*61 + 146*1
求出 5位数中的所有 Lily Number。
输入描述:无
输出描述:一行,5位数中的所有 Lily Number,每两个数之间间隔一个空格。
#include <stdio.h>
int main()
{
int i = 0;
for(i=10000; i<=99999; i++)
{
//判断i是否为lily number
int j = 10;
int sum = 0;
int tmp = i;
for(j=10; j<=10000; j*=10)
{
sum += (tmp%j)*(tmp/j);
}
if(sum == i)
printf("%d ", i);
}
return 0;
}
7调整数组使奇数全部都位于偶数前面。
输入一个整数数组,实现一个函数,来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分,所有偶数位于数组的后半部分。
思路: | |
1. 给定两个下标left和right,left放在数组的起始位置,right放在数组中最后一个元素的位置 | |
2. 循环进行一下操作 | |
a. 如果left和right表示的区间[left, right]有效,进行b,否则结束循环 | |
b. left从前往后找,找到一个偶数后停止 | |
c. right从后往前找,找到一个奇数后停止 | |
d. 如果left和right都找到了对应的数据,则交换,继续a |
void swap_arr(int arr[], int sz)
{
int left = 0;
int right = sz-1;
int tmp = 0;
while (left < right)
{
// 从前往后,找到一个偶数,找到后停止
while ((left < right) && (arr[left] % 2 == 1))
{
left++;
}
// 从后往前找,找一个奇数,找到后停止
while ((left < right) && (arr[right] % 2 == 0))
{
right--;
}
// 如果偶数和奇数都找到,交换这两个数据的位置
// 然后继续找,直到两个指针相遇
if (left < right)
{
tmp = arr[left];
arr[left] = arr[right];
arr[right] = tmp;
}
}
}
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int sz = sizeof(arr) / sizeof(arr[0]);
swap_arr(arr, sz);
for (int i = 0; i < sz - 1; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
8.有序序列判断
描述
输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。数据范围: 3 \le n \le 50 \3≤n≤50 序列中的值都满足 1 \le val \le 100 \1≤val≤100
输入描述:第一行输入一个整数N(3≤N≤50)。第二行输入N个整数,用空格分隔N个整数。
输出描述:输出为一行,如果序列有序输出sorted,否则输出unsorted。
#include<stdio.h>
int main()
{
int N = 0;
int arr[101] = { 0 };
scanf("%d", &N);
int i = 0;
int count1=0;
int count2=0;
for (i = 0; i < N; i++)
{
scanf("%d", &arr[i]);
}
for (i = 0; i < N - 1; i++)
{
if (arr[i] - arr[i + 1]>=0)
{
count1++;
}
else if(arr[i] - arr[i + 1]<=0)
{
count2++;
}
}
if (count1 == N - 1||count2==N-1)
printf("sorted\n");
else
printf("unsorted\n");
return 0;
}
9.有序序列合并
描述
输入两个升序排列的序列,将两个序列合并为一个有序序列并输出。
数据范围: 1 \le n, m \le 1000 \1≤n,m≤1000 , 序列中的值满足 0 \le val \le 30000 \0≤val≤30000
输入描述:输入包含三行,第一行包含两个正整数n, m,用空格分隔。n表示第二行第一个升序序列中数字的个数,m表示第三行第二个升序序列中数字的个数。第二行包含n个整数,用空格分隔。第三行包含m个整数,用空格分隔。
输出描述:输出为一行,输出长度为n+m的升序序列,即长度为n的升序序列和长度为m的升序序列中的元素重新进行升序序列排列合并。
#include<stdio.h>
int main()
{
int m = 0;
int n = 0;
scanf("%d %d", &n, &m);
int i = 0;
int j = 0;
int arr1[1000] = { 0 };
int arr2[1000] = { 0 };
for (i = 0; i < n; i++)
{
scanf("%d", &arr1[i]);
}
for (j = 0; j < m; j++)
{
scanf("%d", &arr2[j]);
}
i = 0;
j = 0;
while (i < n && j < m)
{
if (arr1[i] < arr2[j])
{
printf("%d ", arr1[i]);
i++;
}
else
{
printf("%d ", arr2[j]);
j++;
}
}
if (i == n && j < m)
{
for (; j < m; j++)
printf("%d ", arr2[j]);
}
else
{
for (; i < n; i++)
printf("%d ", arr1[i]);
}
return 0;
}
10.X形图案
KiKi学习了循环,BoBo老师给他出了一系列打印图案的练习,该任务是打印用“*”组成的X形图案。输入描述:多组输入,一个整数(2~20),表示输出的行数,也表示组成“X”的反斜线和正斜线的长度。
输出描述:针对每行输入,输出用“*”组成的X形图案。
#include<stdio.h>
int main()
{
int n = 0;
int i = 0;
int j = 0;
int ch = 0;
while(scanf("%d",&n) != EOF)
{
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
{
if (i == j || i + j == n - 1)
printf("*");
else
printf(" ");
}
printf("\n");
}
}
return 0;
}
11.箭形图案
输出描述:针对每行输入,输出用“*”组成的箭形。
#include<stdio.h>
int main()
{
int n = 0;
int i = 0;
int j = 0;
while (scanf("%d", &n) != EOF)
{
for (i = 0; i <= n; i++)
{
for (j = 0; j < 2 * (n - i); j++)
{
printf(" ");
}
for (j = 0; j < i + 1; j++)
{
printf("*");
}
printf("\n");
}
for (i = 0; i < n; i++)
{
for (j = 0; j < 2 * (i + 1); j++)
{
printf(" ");
}
for (j = 0; j < n - i; j++)
{
printf("*");
}
printf("\n");
}
}
return 0;
}