6-1 数据清洗 (100 分)
数据清洗是指发现并纠正数据文件中可识别的错误的最后一道程序,包括检查数据一致性,处理无效值和缺失值等。小明去某公司实习,公司交给了他一个数据清洗的任务。由于小明是实习生,所以数据清洗的算法公司已经给定,小明的任务仅仅是将清洗后合格的数据按原来的顺序存储并输出。可是小明仍无法完成这个任务,聪明的你能帮帮他吗?
数据清洗的函数原型为:
int dataCleaning(int n);
这里参数n为待处理数据,如果该数据是正确的函数则返回1,如果该数据不正确则函数返回0。在你的函数中需要调用这个函数(不需要实现,直接调用即可)来判断数据是否正确。
函数接口定义:
int getData(int source[] , int size , int target[] );
其中 source
、 size
和 target
都是用户传入的参数。 source
为待清洗数据; size
为数组source
的长度; target
为正确的数据。函数的返回值为正确数据的个数。
裁判测试程序样例:
#include<stdio.h>
int getData(int source[] , int size , int target[] );
int dataCleaning(int n);
int main()
{
int source[110] , target[110];
int i , n , size ;
scanf( "%d", &n ) ;
for ( i = 0 ; i < n ; i++ )
scanf( "%d", &source[i] ) ;
size = getData( source , n, target ) ;
for ( i = 0 ; i < size - 1 ; i++ )
printf( "%d " , target[i] ) ;
printf( "%d\n" , target[i] ) ;
return 0;
}
/* 请在这里填写答案 */
输入样例:
在这里给出一组输入。例如:
10
62 58 20 69 92 4 99 67 12 88
输出样例:
样例解释:输入的10个整数中只有69、99和12是正确的数据。
69 99 12
思路:
判断数字是否正确,用int dataCleaning(int n);
代码:
int getData(int source[] , int size , int target[] ){
int i=0;
int size2=0;
int j=0;
for(i=0;i<size;i++){
if(dataCleaning(source[i])==1){
target[j]=source[i];
j++;
size2++;
}
}
return size2;
}
6-2 递归求解之阿尔法乘积 (100 分)
计算一个整数的阿尔法乘积。对于一个整数x来说,它的阿尔法乘积是这样来计算的:如果x是一个个位数,那么它的阿尔法乘积就是它本身;否则的话,x的阿 尔法乘积就等于它的各位非0的数字相乘所得到的那个整数的阿尔法乘积。例如:4018224312的阿尔法乘积等于8,它是按照以下的步骤来计算的:
4018224312 → 4*1*8*2*2*4*3*1*2 → 3072 → 3*7*2 → 42 → 4*2 → 8
编写一个程序,输入一个正整数(该整数可以用long long 存储),输出它的阿尔法乘积。
输入格式:输入只有一行,即一个正整数。
输出格式:输出相应的阿尔法乘积。
此题要求用递归函数实现。
函数接口定义:
函数原型如下:
long long alpha(long long n) ;
其中 n
是用户传入的参数。 n
的值不超过long long
的范围。函数须返回 n
的阿尔法乘积。
裁判测试程序样例:
#include <stdio.h>
//求一个整数阿尔法乘积的函数
long long alpha(long long n) ;
int main()
{
long long n;
scanf("%lld",&n);
printf("%lld\n",alpha(n));
return 0 ;
}
/* 请在这里填写答案 */
输入样例:
4018224312
输出样例:
8
思路:
递归边界:只有一位数
递归式:自身相乘,再调用alpha函数,直到只有一位数
像之前一样,把要做的写在前边,最后调用自身函数
代码:
long long alpha(long long n){
static long long a=1;
a=n;
long long ans=1;
int s=0;
while(a){
if(a%10!=0){
s=a%10;
ans*=s;
a=a/10;
}
else{
a=a/10;
}
}
//调用自身
if(ans>=10){
a=ans;
alpha(a);
}
else{
return ans;
}
}
6-3 04_拆分字符串 (100 分)
任意给定一个字符串s(长度小于100),其中只包含大写字母“A—Z”和小写字母“a—z”。你的任务是把s中大写字母和小写字母分开,并分别存到指定的字符数组中。拆分后原字母顺序保持不变。本题要求用函数实现。
函数接口定义:
函数接口如下:
void split(const char *s, char *upper, char *lower) ;
其中 s
、upper
和 lower
都是用户传入的参数。其中 s为待拆分字符串,upper为拆分后存大写字母的字符数组,lower为拆分后存小写字母的字符数组。函数返回值为空。
裁判测试程序样例:
函数被调用进行测试的例子如下:
#include<stdio.h>
void split(const char *s, char *upper, char *lower) ;
int main()
{
char s[100] , upper[100] , lower[100] ;
scanf("%s",s);
split( s , upper , lower ) ;
printf("%s\n%s\n", upper , lower) ;
return 0;
}
/* 请在这里填写答案 */
输入样例:
HwEorLLldO
输出样例:
HELLO
world
思路:
打印出现乱码
对字符串输出时,只要找不到'\0'就会一直向后循环,因此字符串最后的结束标记特别重要
代码1:
void split(const char *s, char *upper, char *lower){
char *a=upper;
char *b=lower;
while(*s!='\0'){
if(*s>=65 && *s<=90){
*a=*s;
a++;
}
else if(*s>=97 && *s<=122){
*b=*s;
b++;
}
s++;
}
//%s打印正确必不可少
*a='\0';
*b='\0';
}
代码2:
void split(const char *s, char *upper, char *lower){
int i=0;
int j=0;
int h=0;
char *a=upper;
char *b=lower;
for(i=0;i<100,s[i]!='\0';i++){
//大写
if(s[i]>=65 && s[i]<=90){
a[j]=s[i];
j++;
}
else if(s[i]>=97 && s[i]<=122){
b[h]=s[i];
h++;
}
}
a[j]='\0';
b[h]='\0';
}
总之,一定要判断*s!=‘\0’
7-1 单词统计 (100 分)
给定的字符串中只包含#和小写字母,其中#是分隔符,连续的小写字母构成单词。单词内部不会包含#号,也不存在两个单词之间没有#的情况。请你写一个程序来统计一下一行字符串中单词的数量和#的数量。
输入格式:
第一行为一个整数n(0<n<10),代表共有n个字符串。后边n行,每行一个长度不超过100的字符串。
测试用例保证输入合法。
输出格式:
共n行,每行依次对应输入各个字符串。
每行的格式如下:
首先是一个整数,代表单词的数量,跟着是一个空格;然后又是一个整数,代表#的数量,跟着又是一个空格;最后依次输出所有单词,单词之间用一个空格分隔,最后一个单词后边没有空格。如果单词的数量为0,则在应该输出单词的位置输出三个连续的#。
输入样例:
2
#
hello#world
输出样例:
0 1 ###
2 1 hello world