返回狼盟编程首页
编程搜索 [狼盟旧档]
论坛统计


请输入搜索关键字:
├─◆ 狼盟首页 > 查看贴子 > 详细信息

楼主

请教3道有水平的题(感觉第一题最复杂),用C写


第一题:输入一行字符,统计这行字符中重复出现过的字符串(以任意单个字母表示字符输入结束)。

例如:

请输入字符串

asdf  sadf  gkro  sgojrg  a(输入的字符)

a后面再没有字符串了

没有重复出现过的字符串(输出结果)



另外例如:

请输入字符串

asdf  asdf  gkro  sgojrg  b

b后面再没有字符串了

asdf已连续出现2次



第二题: 从键盘输入10个正整数,且每个数均在1000至9999之间。请编制函数jsSort(),其函数的功能是:要求按每个数的后三位的大小进行升序排列,然后将满足此条件的数存入数组b中,如果后三位的数值相等,则按原先的数值进行降序排列。(南开)

例:请输入10个数(1000~9999):

处理前 6012  5099  9012  7025  8088

处理后 9012  6012  7025  8088  5099(012<025<088<099,按升序排列;而前两个数中012=012,则比较9012>6012,按降序排列。所以得此顺序)



第三题:.歌德巴赫猜想

    验证:2000以内的正偶数都能够分解为两个素数之和(即验证歌德巴赫猜想对2000以内  的正偶数成立)。在屏幕上显示:

        4=2+2

        6=3+3

        8=3+5

        10=3+7

        12=5+7

        14=3+11

        …



三道题,牵涉到的知识点比较多,我是初学者,不算太明白,相信大虾指点以后我能有不少的长进,先谢谢了!









寂寞化石 [ 1 楼 ]
2003-05-31 18:29:00
三道题需要耐心,希望大虾能好好看一看 

lheng [ 2 楼 ]
2003-06-01 12:37:00
我尝试做第三条吧 

C爱好者 [ 3 楼 ]
2003-06-01 21:48:00
第一题中的例子asdf  asdf  gkro  sgojrg  b,中不是有重复出现的
as:2
asd:2
asdf:2
sd:2
sdf:2
df:2
这些字符串吗?你怎么说是只有:asdf两个啊? 

寂寞化石 [ 4 楼 ]
2003-06-02 09:35:00
确实,你的考虑更全面
我一会儿就去调试一下
谢谢你的帮助 

寂寞化石 [ 5 楼 ]
2003-06-02 10:12:00
其实,我觉得还是只能算asdf,这也是空格的目的
就是以空格为间断重复出现过的字符串 

寂寞化石 [ 6 楼 ]
2003-06-02 10:16:00
再说,第一个例子里面不就是说明了吗?
所以我觉得应该只算类似于只有“asdf”这种的 

C爱好者 [ 7 楼 ]
2003-06-02 13:53:00
那你题目就应该说明是以空格来划分一个字符串啦。 

C爱好者 [ 8 楼 ]
2003-06-02 14:11:00
jsSort(int n[],int b[])
{int i,j,k;
for(i=0;i<10;i++)
  for(j=i;j<10;j++)
    if(n[i]%1000>n[j]%1000)
        {k=n[i];n[i]=n[j];n[j]=k;}
     else if(n[i]%1000==n[j]%1000&&n[i]<n[j])
           {k=n[i];n[i]=n[j];n[j]=k;}
for(i=0;i<10;i++)
   b[i]=n[i];
}
main()
{int n[10],b[10]={0},i;
for(i=0;i<10;i++)
  scanf("%d",&n[i]);
jsSort(n,b);
for(i=0;i<10;i++)
  printf("%d,",b[i]);
}
 

C爱好者 [ 9 楼 ]
2003-06-02 14:12:00
上面是第二题。 

C爱好者 [ 10 楼 ]
2003-06-02 14:30:00
这是第三题,你把其中的20改为2000就符合你这题的要求了。
ck(int k)
{int i;
for(i=2;i<k;i++)
  if(k%i==0)return 0;
return 1;
}
main()
{int i,j,k;
for(k=2;k<=20;k+=2)
  for(i=2;i<=k/2;i++)
    {if(ck(i)&&ck(k-i))
        printf("%d=%d+%d ",k,i,k-i);
    }


lheng [ 11 楼 ]
2003-06-03 10:35:00
兄弟,我已经帮你解决了第三条题,我是用c++写的,调试过是行的,但是由于时间问题,我没有用子程序分开,程序写的有点乱,请见谅。
#include<iostream.h>
int num[2000];
int Num[304];
int doublenum[1000];
void main ()
{

int n,i,k,j,a,b,h=0,d,g;
num[0]=1;
num[1]=2;
//定义一个2000以内的索数数组
    for(a=2,n=3;n<=2000,a<2000;n++,a++)
{
j=i;
for(k=2;k<n;k++)
{

          if(n%k==0)
 break;
  else
     
  if((k==(n-1))&&(n%k!=0))
  i=n;
}
if((n==3)||(j!=i)||(num[a]!=0))
{num[a]=i;

}

}

  for(b=0;b<304;b++)
{

if(b!=0)
a=a+1;
else
a=0;
for(;a<2000;a++)
{

if((num[a]!=0)&&(h!=num[a]))
{h=num[a];
break;}
}
    Num[b]=h;
   
}  
//定义一个2000以内的偶数数组
  for(d=0,g=1;d<1000;d++,g++)
  {
  doublenum[d]=2*g;
  }
  //列举
  for(d=0;d<1000;d++)
  {
  for(b=0;b<304;b++)
  {
  for(a=0;a<304;a++)
  {
  if(doublenum[d]==Num[b]+Num[a])
  break;
  }
 if(doublenum[d]==Num[b]+Num[a])
  break;
  }
  cout<<doublenum[d]<<"="<<Num[b]<<"+"<<Num[a]<<endl;
  }


lheng [ 12 楼 ]
2003-06-03 10:38:00
看了“C爱好者”的程序,看来我要加把劲练习了。