一条长廊里依次装有n(1 ≤ n ≤ 65535)盏电灯,从头到尾编号1、2、3、…n-1、n。每盏电灯由一个拉线开关控制。开始,电灯全部关着。
有n个学生从长廊穿过。第一个学生把号码凡是1的倍数的电灯的开关拉一下;接着第二个学生把号码凡是2的倍数的电灯的开关拉一下;接着第三个学生把号码凡是3的倍数的电灯的开关拉一下;如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下。n个学生按此规定走完后,长廊里电灯有几盏亮着。 注:电灯数和学生数一致。
void light(int n)
{
int cnt = 0;
// int a[n]={0};
int *a = new int[n+1];
memset(a,0,(sizeof(int)*(n+1)));
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)
{
if(j%i == 0)
{
if(!a[j])
a[j] = 1;
else
a[j] = 0;
}
}
}
for(int k=1;k<=n;k++)
{
if(a[k])
{
// printf("%d ",k);
cnt++;
}
}
cout<<endl;
printf("%d\n",cnt);
delete [] a;
}
2,正整数的大数相加
void bigPlus(char* a, char *b)
{
int i = strlen(a)-1;
int j = strlen(b)-1;
int len = i>j?i:j;
char *res = new char[len+2];
memset(res,0,(sizeof(char)*(len+2)));
int cnt = 0;
int k = 0;//k是进位标志
while(i>=0&&j>=0)
{
res[cnt++] = (((a[i]-'0')+(b[j]-'0')+k)%10)+'0';
k = ((a[i]-'0')+(b[j]-'0')+k)/10;
i--;j--;
}
while(i>=0)
{
res[cnt++] = (((a[i]-'0')+k)%10)+'0';
k = ((a[i]-'0')+k)/10;
i--;
}
while(j>=0)
{
res[cnt++] = (((b[j]-'0')+k)%10)+'0';
k = ((b[j]-'0')+k)/10;
j--;
}
if(k!=0)
res[cnt++] = '1';
for(int t = cnt-1;t>=0;t--)
{
printf("%c",res[t]);
}
cout<<endl;
delete [] res;
}
3,
题目描述(40分):
通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串压缩程序,将字符串中连续出席的重复字母进行压缩,并输出压缩后的字符串。
压缩规则:
1、仅压缩连续重复出现的字符。比如字符串"abcbc"由于无连续重复字符,压缩后的字符串还是"abcbc"。
2、压缩字段的格式为"字符重复的次数+字符"。例如:字符串"xxxyyyyyyz"压缩后就成为"3x6yz"。
要求实现函数:
void stringZip(const char *pInputStr, long lInputLen, char *pOutputStr);
【输入】 pInputStr: 输入字符串
lInputLen: 输入字符串长度
【输出】 pOutputStr: 输出字符串,空间已经开辟好,与输入字符串等长;
【注意】只需要完成该函数功能算法,中间不需要有任何IO的输入输出
示例
输入:“cccddecc” 输出:“3c2de2c”
输入:“adef” 输出:“adef”
输入:“pppppppp” 输出:“8p”
void myZip(const char *pInputStr, long lInputLen, char *pOutputStr)
{
char buffer[20];
int num = 0,k=0;
for(int i =0;i<strlen(pInputStr);i++)
{
for(int j=i+1;j<strlen(pInputStr);j++)
{
if(pInputStr[i] == pInputStr[j])
{
num++;
}
else
break;
}
if(0 != num)
{
memset(buffer,0,sizeof(buffer));
itoa(num+1,buffer,10);
strcpy(pOutputStr+k,buffer);
k += strlen(buffer);
}
pOutputStr[k++] = pInputStr[i];
i +=num;
num = 0;
}
pOutputStr[k ]='\0';
printf("%s\n",pOutputStr);
}
int main(int argc, char* argv[])
{
char a[max]={0};
char b[max]={0};
while(scanf("%s %s",a,b)!= EOF)
{
// myZip(a,20,b);
bigPlus(a,b);
}
// int num;
// cin>>num;
// light(num);
char tmp;
tmp = getchar();
return 0;
}
4,题目:
描述:
输入一串数字,找到其中包含的最大递增数。递增数是指相邻的数位从小到大排列的数字。如: 2895345323,递增数有:289,345,23, 那么最大的递减数为345。
输入:
输入一串数字,默认这串数字是正确的,即里面不含有字符/空格等情况
输出:
输出最大递增数
样例输入:
123526897215
样例输出:
2689
void getMaxSub(char* a,int len)
{
char* tmp = new char[len];
memset(tmp,0,sizeof(char)*len);
char* ans = new char[len];
memset(ans,0,sizeof(char)*len);
int cnt = 0,last =0;
for(int i =0;i<len;i++)
{
if((i+1)<len&&a[i+1]>a[i])
tmp[cnt++] = a[i];
else{
tmp[cnt++] = a[i];
if(cnt>last)
{
strcpy(ans,tmp);
last = cnt;
}
if(cnt == last)
if(strcmp(tmp,ans)>=0)
strcpy(ans,tmp);
last = cnt;
}
cnt = 0;
memset(tmp,0,sizeof(char)*len);
}
}
for(int j = 0;j<len;j++)
{
if(ans[j]!=0)
printf("%c",ans[j]);
}
cout<<endl;
delete [] tmp;
delete [] ans;
}