题目1:
有一个有序数字序列,从小到大排序,将一个新输入的数插入到序列中,保证插入新数后,序列仍然是升序。
输入描述:
第一行输入一个整数N(0≤N≤50)。
第二行输入N个升序排列的整数,输入用空格分隔的N个整数。
第三行输入想要进行插入的一个整数。
输出描述:
输出为一行,N+1个有序排列的整数。
方法一:
投机取巧:以插入的数m为分水岭,先遍历数组输出比m小的,然后输出m,再遍历数组,输出比m大的,本质上没有真的把数插入数组里,只是在输出结果上做文章。
int main()
{
int n=0;
scanf("%d",&n);
int arr[50];
int i=0;
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
int m=0;
scanf("%d",&m);
for(i=0;i<n;i++)
{
if(arr[i]<=m)
{
printf("%d ",arr[i]);
}
}
printf("%d ",m);
for(i=0;i<n;i++)
{
if(arr[i]>m)
{
printf("%d ",arr[i]);
}
}
return 0;
}
方法二:
认认真真把数插入数组里,然后输出
int main()
{
int n,insert;
scanf("%d",&n);
int arr[50];
for(int i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
scanf("%d",&insert);
for(int i=0;i<n;i++)
{
if(insert<arr[i])//定位插入位置
{
for(int j=n+1;j>i;j--)//后面全都往后窜一位
{
arr[j]=arr[j-1];
}
arr[i]=insert;
break;
}
arr[n]=insert;//要插入的值比所有原数组中所元素都大,放在末尾
}
for(int i=0;i<n+1;i++)
printf("%d ",arr[i]);
return 0;
}
题目2:
有一个整数序列(可能有重复的整数),现删除指定的某一个整数,输出删除指定数字之后的序列,序列中未被删除数字的前后位置没有发生改变。
输入描述:
第一行输入一个整数(0≤N≤50)。
第二行输入N个整数,输入用空格分隔的N个整数。
第三行输入想要进行删除的一个整数。
输出描述:
输出为一行,删除指定数字之后的序列。
方法一:
投机取巧:遍历数组,输出数组中 不等于 指定删除数 的数字,本质上没有真的把数从数组里删除,只是在输出结果上做文章。
#include <stdio.h>
int main()
{
int n=0;
scanf("%d",&n);
int arr[51]={0};
int i=0;
for(i=0;i<n;i++)
{
scanf("%d",&arr[i]);
}
int del=0;
scanf("%d",&del);
for(i=0;i<n;i++)
{
if(arr[i]!=del)
{
printf("%d ",arr[i]);
}
}
return 0;
}
方法二:认认真真在数组中删除该数字
int main()
{
int n = 0;
scanf("%d", &n);
int arr[51] = { 0 };
int i = 0;
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
int del = 0;
scanf("%d", &del);
for (i = 0; i < n; i++)
{
if (arr[i] == del)
{
for (int j = i ; j <n; j++)//后面全都往前移一位
{
arr[j] = arr[j + 1];
}
n--;//每删除一次,打印的时候就少打印一位
i--;
}
}
for (i = 0; i < n; i++)
{
printf("%d ", arr[i]);
}
return 0;
}
题目3:输入一个整数序列,判断是否是有序序列,有序,指序列中的整数从小到大排序或者从大到小排序(相同元素也视为有序)。
输入描述:
第一行输入一个整数N(3≤N≤50)。
第二行输入N个整数,用空格分隔N个整数。
输出描述:
输出为一行,如果序列有序输出sorted,否则输出unsorted。
答案:
有序的3种情况:
1.从小到大:1 2 5 7 9
2.从大到小:9 7 6 3 1
3.每个数字大小都一样:1 1 1 1 1 1
解决思路:
把前一个和后一个作差,如果大于0,计数器count1就++,若是最后count1=n-1,则说明数列后一个数都比前一个数小,这就是从大到小的有序。
把前一个和后一个作差,如果小于0,计数器count2就++,若是最后count2=n-1,则说明数列后一个数都比前一个数大,这就是从小到大的有序。
差等于0同理。
如果最后count1和count2没有一个等于n-1,说明这个数列无序
#include <stdio.h>
int main()
{
int arr[50] = { 0 };
int n=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])
{
count1++;
}
else if(arr[i]<=arr[i+1])
{
count2++;
}
}
if (count1==n-1 || count2==n-1)
{
printf("sorted");
}
else
{
printf("unsorted");
}
return 0;
}
题目4:
用筛选法求n以内的素数。筛选法求解过程为:将2~n之间的正整数放在数组内存储,将数组中2之后的所有能被2整除的数清0,再将3之后的所有能被3整除的数清0 ,以此类推,直到n为止。数组中不为0 的数即为素数。
输入描述:
多组输入,每行输入一个正整数(不大于100)。
输出描述:
针对每行输入的整数n,输出两行,第一行,输出n之内(包括n)的素数,用空格分隔,
第二行,输出数组中2之后被清0 的个数。每行输出后换行。
#include <stdio.h>
int main() {
int n=0;
int arr[100]={0};
while (scanf("%d",&n)!= EOF)
{
int i=0;
int j=0;
for(i=2;i<=n;i++)
{
arr[i]=i;
}
for(int i=2;i<=n;i++)
{
for(j=2;j<i;j++)
{
if(i%j==0)
{
arr[i]=0;//只要i能被2-i之间的数整除就清零
}
}
}
int count=0;
for(i=2;i<=n;i++)
{
if(arr[i]!=0)
{
printf("%d ",arr[i]);
}
else
{
count++;
}
}
printf("\n%d",count);
}
return 0;
}