我们学校的程序设计选拔赛

风中老狼 2012-05-13 05:41:21
1.规则是3个空瓶子可以换一瓶酒。假如有10个瓶子,先换3瓶啤酒,这时有4个空瓶子,再换一瓶啤酒,这时有2个空瓶子,这时候再借1瓶,喝完再换1瓶还给老板。现在求n个瓶子最多能换多少瓶酒?


2.求回文数,输入一个数P,求离P最近的N(N>P),N要是回文数。
类似5,11,131,1221 都是回文数。


3.输入两个二进制数(长度要一样,不能超过100位),判断对应位置上有几位不相同。例如000和111有3位不同,11100,00011有5位不同。。。


小弟大一菜鸟一个,求各位大神指教。



...全文
662 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
q244767346 2012-06-14
  • 打赏
  • 举报
回复
第一题 另类思路
既然允许借酒
如果你有两瓶酒,你先借一瓶,这是你就有3瓶酒了,然后 用三个空瓶子换取一瓶酒还掉刚才借的酒,
这时候 你手里就没有 东西了,总而言之就是说 只要你有2瓶酒 就能够换取一瓶;
//
#include<iostream>
int main()
{
int num=0;
std::cin>>num;//你有 num瓶酒

num = num/2;//num 是int型

std::cout<<"你可以换取的瓶数"<<num<<std::endl;



return 0;
}
code复活 2012-06-14
  • 打赏
  • 举报
回复
补充下: N的左半部分= p的左半部分值 > 右半部分对称过来的值 ? 左半部分值 : (左半部分逆序的值> 右半部分逆序的值 ?左半部分值 :左半部分+1)
code复活 2012-06-14
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]
我的办法是,先看p是否为回文数,如果是:那么把N的左半部分就为p左半部分数+1,右半部分为对称的;
如果p不是回文数,那么 N的左半部分= p的左半部分值 > 右半部分对称过来的值 ? 左半部分值 : 右半部分对称过来的值, N的有半部分与左半部分是对称的。。。
注意 当p的位数为奇数时,有点不同,相信楼主已经知道了。。。
[/Quote]
想到利用P,很好
先看p是否为回文数,如果是:那么把N的左半部分就为p左半部分数+1,右半部分为对称的;
不错,很赞同
不过后面的,个人觉得不行
如果p不是回文,那么 N的左半部分= p的左半部分值 > 右半部分对称过来的值 ? 左半部分值 : 右半部分对称过来的值, N的有半部分与左半部分是对称的。。。
这点,不是很赞同,如果右半部分 :比如 1219,回文后:9119,其实 1221 就可以回文了
1245
N的左半部分= p的左半部分值 > 右半部分对称过来的值 ? 左半部分值 : (左半部分逆序的值> 右半部分逆序的值 ?左半部分值 :右半部分值)
N的有半部分与左半部分是对称的。。。
neil_wang1992 2012-05-27
  • 打赏
  • 举报
回复
#include<iostream>
using namespace std;
void main()
{
char a[100],b[100];
cin>>a;
cin>>b;
for(int i=0;a[i]!='\0';)
{
if(a[i]!=b[i]) i++;
}
cout<<"Hamming distance is "<<i<<"."<<endl;
}
注意字符数组的使用特点!
neil_wang1992 2012-05-26
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
void judge(int );
int main()
{
int p;
cout<<"Please enter the number:"<<endl;
cin>>p;
judge(p);
return 0;
}
void judge(int m)
{
int n,s,x,y,b=m,d=m;
for(int i=0;;i++)
{
int a;
x=0;
n=b++;
a=n;
while(n)
{
s=n%10;
x=x*10+s;
n/=10;
}
if(x==a)
break;
}
for(int j=0;;j++)
{
int c;
y=0;
n=d--;
c=n;
while(n)
{
s=n%10;
y=y*10+s;
n/=10;
}
if(y==c)
break;
}
if(i<j)
cout<<"The closet Palindromic number is "<<x<<endl;
else if (i==j)
cout<<"The closet Palindromic number is "<<y<<"or"<<x<<endl;
else
cout<<"The closet Palindromic number is "<<y<<endl;
}
第二题,还可以改进,是最笨的方法
neil_wang1992 2012-05-23
  • 打赏
  • 举报
回复
#include <iostream>
using namespace std;
int main()
{
int a[5],b[5],c[5];
int sum=0,n;
cout<<"Please enter the number:"<<endl;
cin>>n;
c[0]=n;
for(int i=0;c[i]>=3;i++)
{
a[i]=c[i]/3;
b[i]=c[i]%3;
c[i+1]=a[i]+b[i];
}
for(int j=0;j<i;j++)
{
sum+=a[j];
}
if(c[i]==2) sum+=1;
cout<<"sum= "<<sum<<endl;

return 0;
}
第一题,提供一种思路。
lanmeng521131485 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
C/C++ code
#include<stdio.h>
void main()
{
int fun(long);
long N,P;
printf("请输入一个数P:\n");
scanf("%ld",&P);
for(N=P+1;;N++){
if(fun(N)==1){
printf(……
[/Quote]


恩这个不错,没想到。
lanmeng521131485 2012-05-23
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]
第三题

#include<iostream>
using namespace std;
void main()
{

char a[100],b[100];
while(1)
{
int k=0;
cin>>a;
if(a[0]=='X')break;
cin>>b;
for(int m=0,n=0,i=0;i<100;i++)
{
if(a[m++]!=b[n+……
[/Quote]


你这个最后的判断条件错了吧!!
重庆-老白 2012-05-23
  • 打赏
  • 举报
回复

把代码放在他们中间
ode=C/C++]这里放代码[/code
powerW 2012-05-23
  • 打赏
  • 举报
回复
这段代码对于某些数字会出错
[Quote=引用 12 楼 的回复:]

C/C++ code
#include<stdio.h>
void main()
{
int fun(long);
long N,P;
printf("请输入一个数P:\n");
scanf("%ld",&P);
for(N=P+1;;N++){
if(fun(N)==1){
printf("\n离P最近的……
[/Quote]
qiumin333 2012-05-13
  • 打赏
  • 举报
回复
#include<stdio.h>
void main()
{
int fun(long);
long N,P;
printf("请输入一个数P:\n");
scanf("%ld",&P);
for(N=P+1;;N++){
if(fun(N)==1){
printf("\n离P最近的N(N>P)的回文数是: %ld\n",N);
break;
}
}
}
#include<math.h>
int fun(long m)
{
long i,k;
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>k)return 1;
else return 0;
}
qiumin333 2012-05-13
  • 打赏
  • 举报
回复
#include<stdio.h>
void main()
{
int fun(long);
long N,i;
scanf("%ld",&N);
for(i=N;;i++){
if(fun(i)==1){
printf("%d\n",i);
break;
}
}
}
#include<math.h>
int fun(long m)
{
long i,k;
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>k)return 1;
else return 0;
}
qiumin333 2012-05-13
  • 打赏
  • 举报
回复

#include<stdio.h>
void main()
{
int fun(long);
long N,i;
scanf("%ld",&N);
for(i=N;;i++){
if(fun(i)==1){
printf("%d\n",i);
break;
}
}
}
#include<math.h>
int fun(long m)
{
long i,k;
k=sqrt(m);
for(i=2;i<=k;i++)
if(m%i==0)break;
if(i>k)return 1;
else return 0;
}
fjweigege 2012-05-13
  • 打赏
  • 举报
回复
我的办法是,先看p是否为回文数,如果是:那么把N的左半部分就为p左半部分数+1,右半部分为对称的;
如果p不是回文数,那么 N的左半部分= p的左半部分值 > 右半部分对称过来的值 ? 左半部分值 : 右半部分对称过来的值, N的有半部分与左半部分是对称的。。。
注意 当p的位数为奇数时,有点不同,相信楼主已经知道了。。。
风中老狼 2012-05-13
  • 打赏
  • 举报
回复


搞不懂这个咋用
风中老狼 2012-05-13
  • 打赏
  • 举报
回复
#include < iostream.h>
void main ()
{
int x,s=0,a,t;

cout<<"请输入整数x:"<<endl;
cin>>x;
a=x;
while (x)
{ t=x%10;
s=s*10+t;
x=x/10;
}

if (a==s)
cout<<"此整数是回文数!"<<endl;
else
cout<<"此整数不是回文数!"<<endl;
}
亮色系 2012-05-13
  • 打赏
  • 举报
回复
4楼 还要有一个减减吧,那个回文数可能在p之前也可能在p之后啊!!!
要判断哪一侧的回文数离p更近!!!!
youkuxiaobin 2012-05-13
  • 打赏
  • 举报
回复
判断没写,如果不是就++
youkuxiaobin 2012-05-13
  • 打赏
  • 举报
回复
第二题有种笨方法
就是在P的基础上++,每加一个数,就判断这个数是不是回文数

cin >> p
list<int> m_bit; //这是一个stl模板 是一个链表,动态插入删除,你可以使用数组
int remain ;
while(1)
{
m_bit.push_back(p%10);
remain = p/10;
if(remain == 0)
{
break;
}
p = remain;
}

风中老狼 2012-05-13
  • 打赏
  • 举报
回复
第二题不会,求指教
加载更多回复(2)

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧