回 帖 发 新 帖 刷新版面

主题:入门必做的题

1.  给定等式  A B C D E     其中每个字母代表一个数字,且不同数字对应不
                    D F G     同字母。编程求出这些数字并且打出这个数字的
             +      D F G     算术计算竖式。

             ───────

                X Y Z D E



  2. A、B、C、D、E五名学生有可能参加计算机竞赛,根据下列条件判断哪些
  人参加了竞赛:

   (1)A参加时,B也参加;

   (2)B和C只有一个人参加;

   (3)C和D或者都参加,或者都不参加;

   (4)D和E中至少有一个人参加;

   (5)如果E参加,那么A和D也都参加。



  3. 打印一个 N*N 的方阵,N为每边           N=15  打印出下面图形
 字符的个数(3<N<20), 要求最               TTTTTTTTTTTTTTT
 外一层为"T", 第二层为"J", 从第三层               TJJJJJJJJJJJJJT
 起每层依次打印数字 1,2,3,...                     TJ11111111111JT
 (右图以N为15为例)                           TJ12222222221JT
                                                  TJ12333333321JT
                                                  TJ12344444321JT
                                                  TJ12345554321JT
                                                  TJ12345654321JT
                                                  TJ12345554321JT
                                                  TJ12344444321JT
                                                  TJ12333333321JT
                                                  TJ12222222221JT
                                                  TJ11111111111JT
                                                  TJJJJJJJJJJJJJT
                                                  TTTTTTTTTTTTTTT



  4. 在N行N列的数阵中, 数K(1〈=K〈=N)在每行和每列中出现且仅
  出现一次,这样的数阵叫N阶拉丁方阵。例如下图就是一个五阶拉丁方阵。
  编一程序,从键盘输入N值后,打印出所有不同的N阶拉丁方阵,并统计个数。

        1  2  3  4  5
        2  3  4  5  1
        3  4  5  1  2
        4  5  1  2  3
        5  1  2  3  4


  5. 输入一个十进数,将其转换成 N 进制数(0<N<=16)。

回复列表 (共635个回复)

581 楼

我一定会把他们全挑战完的!!!!!!

582 楼

有没有参考答案?

583 楼

/*66. ( NOI'94.1_2 ) 编程实现两个高精度实数减法,两数分别由键盘输入,均不
  超过240位。
 ( 参看程序 5 )
*/
#include <iostream>
using namespace std;
#include <string>
 
int check(char t[240])
{int i=0,n,dot=0;
 n=strlen(t);
 while (i<n)
 {if (t[i]<'0'||t[i]>'9')
 {    if (t[i]=='.')
 {        if (i==0||i==n-1)
              return 0;
         else
         {    dot++;
           if (dot>=2)
               return 0;
           else
               i++;
         }
 }
 else
      return 0;
 }
 else       
      i++;
  }
      return 1;
}

void cl(char t[240])
{int i=0,n,p,q;
 n=strlen(t);
 while (t[i]=='0'||t[i]==' ')
        i++;
if (t[i]=='.')
   p=i-1;
else
   p=i;
   i=n-1;
while (t[i]=='0')
       i--; 
q=i;
 for (int k=0;p<=q;p++,k++)
     t[k]=t[p];
t[k]='\0';
}

void input(char ch[240])
{gets(ch);
 while (!check(ch))
 {      cout<<"你输入的是错误的实数,请重新输入,错误的字符是:"<<ch<<endl;
        gets(ch);
 }
        cl(ch);
}

int dot_location(char ch[240])
{int len;
 len=strlen(ch);
 for (int i=0;i<len;i++)
     if (ch[i]=='.')
         return i+1;
}

int ss_strcmp(char a[240],char b[240])
{int i=0,adot,bdot,alen,blen,len;
 alen=strlen(a);
 blen=strlen(b);
 adot=dot_location(a);
 bdot=dot_location(b);
 if (adot>bdot)
     return 1;
 else if (adot<bdot)
          return 0;
 else
 {if (alen>=blen)
      len=blen;
  if (alen<=blen)
      len=alen;
  while (i<len)
  {if (a[i]==b[i])
       i++;
   if (a[i]=='\0'&&i<len||a[i]<b[i])
       return 0;
   if (b[i]=='\0'&&i<len||a[i]>b[i])
       return 1;
  }
 }
}

int len_s(char c1[240],char c2[240])
{int adot,bdot,alen,blen;
 alen=strlen(c1);
 blen=strlen(c2);
 adot=dot_location(c1);
 bdot=dot_location(c2);
 if (adot==bdot)
 {if (alen<blen)
      return blen;
  else
      return alen;
 }
 else if (adot<bdot)
 {if (alen<blen)
     return blen;
  else
      return alen+1;

 }
 else
 {if (alen>blen)
      return alen;
  else
      return blen+adot-bdot;
 }
}
 
void jf(char c1[240],char c2[240])
{char c[240];
 int i,j,len,p,adot,bdot,c1len,jw=0,c2len;
 len=len_s(c1,c2);
 c1len=strlen(c1);
 c2len=strlen(c2);
 adot=dot_location(c1);
 bdot=dot_location(c2);
 for (i=c1len;i<len;i++)
      c1[i]='0';
 for (i=adot-bdot,j=0;i<len;i++,j++)
    if (j<c2len)
        c[i]=c2[j];
     else
         c[i]='0';
 for (i=adot-bdot-1;i>=0;i--)
      c[i]='0';
 for (i=0;i<len;i++)
      c2[i]=c[i];
 for (i=len-1;i>=0;i--)
 {if ((c1[i]<c2[i]&&c1[i]=='0')||(c1[i]==c2[i]&&c1[i]!='.'&&jw==1)||(c1[i]==c2[i]&&jw==1)||(c1[i]<c2[i]&&jw==0)||(c1[i]<c2[i]&&jw==1))
           {c[i]=(c1[i]+10-jw-c2[i])%10+'0';jw=1;}
  if ((c1[i]==c2[i]&&c1[i]!='.'&&jw==0)||(c1[i]>c2[i]&&jw==0)||(c1[i]==c2[i]&&jw==0))
  {c[i]=c1[i]-c2[i]+'0';jw=0;}
  if (c1[i]>c2[i]&&jw==1)
  {c[i]=c1[i]-jw-c2[i]+'0';jw=0;}
  if (c1[i]==c2[i]&&c1[i]=='.')
      c[i]='.';
 }
 if (c[0]=='0')
      p=1;
 else 
      p=0;
 cout<<"两实数相减为:\n";
 for(i=p;i<len;i++)
     cout<<c[i];
     cout<<endl;
}

void main()
{char a[240],b[240];
 int adot,bdot,flag,maxlen;
 cout<<"请输入实数A:\n";
 input(a);
 cout<<"请输入实数B:\n";
 input(b);
 system("cls");
 cout<<"实数A为:\n";
 cout<<a;
 cout<<"\n实数B为:\n";
 cout<<b<<endl;
 flag=ss_strcmp(a,b);
 if (flag)
 {cout<<"实数A减实数B为:\n";
  jf(a,b);
 }
 else
 {cout<<"实数B减实数A为:\n";
  jf(b,a);
 }
 cout<<endl;
}

584 楼

/*76. (省刻度尺问题)给定长度为 L 的直尺, L 为整数, 且L≤40. 为了能一次直接
 量出  1,2,...,L 的各种长度, 该尺内部至少要有多少条刻度 ?  请输出最少刻度
 数( 不含两端点)及每个刻度的位置. 测量长度时可利用两端点, 其位置分别为 0,
 L.
    输入: 由键盘输入 L.
    输出: 用文本文件按以下格式输出结果(文件名: ANS2.TXT):
      第 1 行: S ( 最少刻度数 )
      第 2 行: 尺内 S 个刻度的位置
      第 3 行至第 L+2 行: 每行输出 3 个用空格隔开的整数 t m n, 其中
 1≤t≤L 为要测量的各长度, m,n 依次为该长度的起止刻度 (m<n).
    例: 如果 L=6, 则一个正确的输出是:
       2
       1 4                    提示:  (1) 最少刻度数 S 应满足:
       1 0 1                     C[S+2,2]=(S+2)*(S+1)/2≥L.
       2 4 6                         (2) 除两端点外, 第一个刻度可取为
       3 1 4                     A[1]=1, 第二个刻度可在 1, L-2, L-1 这
       4 0 4                     三个数中选取.
       5 1 6
       6 0 6
*/
#include <iostream>
using namespace std;
#include <fstream>
#include <iomanip>
#define max 80

void main()
{int l,n,i,a[max];
 a[0]=0,a[1]=1;
 ofstream outfile("ans2.txt");
 if (!outfile)
 {cerr<<"error"<<endl;
  exit(1);
 }
 cin>>l;
 while (l<0||l>max)
 {cout<<"输入的刻度超出范围,请重新输入:\n";
  cin>>l;
 }
 system("cls");
 if (l>4)
 {{n=(l+3)/2;
  cout<<n-2;
  cout<<endl;
  outfile<<n-2<<endl;
  if (l%2==0)
      a[2]=4;
  else
      a[2]=3;
 }
 for (i=3;i<n;i++)
     a[i]=a[i-1]+2;
 for (i=1;i<n-1;i++)
 {cout<<a[i]<<" ";
  outfile<<a[i]<<" ";
 }
 cout<<endl;
 outfile<<endl;
 int m=1;
 while (m<=l)
 {i=0;
   while(i<n)
   {int j=i+1;
    while (j<n)
    {if (a[j]-a[i]==m)
      {cout<<m<<setw(2)<<a[i]<<setw(2)<<a[j]<<endl;
       outfile<<m<<setw(2)<<a[i]<<setw(2)<<a[j];
       outfile<<endl;
       break;
    }
    else
        j++;
    }
    i++;
 }
 i=0,m++;
 }
 }
 if (l==1||l==2||l==3)
 {cout<<1<<endl;
  outfile<<1<<endl;
  cout<<1<<endl;
  outfile<<1<<endl;
  cout<<1<<" "<<0<<" "<<1<<endl;
  outfile<<1<<" "<<0<<" "<<1<<endl;
 }
 if (l==2)
 {cout<<1<<" "<<1<<" "<<2<<endl;
  outfile<<2<<" "<<0<<" "<<2<<endl;
  cout<<2<<" "<<0<<" "<<2<<endl;
  outfile<<2<<" "<<0<<" "<<2<<endl;
 }
 if (l==3)
 {cout<<2<<" "<<1<<" "<<3<<endl;
  outfile<<2<<" "<<1<<" "<<3<<endl;
  cout<<3<<" "<<0<<" "<<3<<endl;
  outfile<<3<<" "<<0<<" "<<3<<endl;
 }
 if (l==4)
 {cout<<2<<endl;
  outfile<<2<<endl;
  cout<<1<<" "<<2<<endl;
  outfile<<1<<" "<<2<<endl;
  cout<<1<<" "<<0<<" "<<1<<endl;
  outfile<<1<<" "<<0<<" "<<1<<endl;
  cout<<2<<" "<<0<<" "<<2<<endl;
  outfile<<2<<" "<<0<<" "<<2<<endl;
  cout<<2<<" "<<2<<" "<<4<<endl;
  outfile<<2<<" "<<2<<" "<<4<<endl;
  cout<<3<<" "<<1<<" "<<4<<endl<<endl;
  outfile<<3<<" "<<1<<" "<<4<<endl<<endl;
  cout<<2<<endl;
  outfile<<2<<endl;
  cout<<1<<" "<<3<<endl;
  outfile<<1<<" "<<3<<endl;
  cout<<1<<" "<<0<<" "<<1<<endl;
  outfile<<1<<" "<<0<<" "<<1<<endl;
  cout<<1<<" "<<3<<" "<<4<<endl;
  outfile<<1<<" "<<3<<" "<<4<<endl;
  cout<<2<<" "<<1<<" "<<3<<endl;
  outfile<<2<<" "<<1<<" "<<3<<endl;
  cout<<3<<" "<<0<<" "<<3<<endl;
  outfile<<3<<" "<<0<<" "<<3<<endl;
  cout<<3<<" "<<1<<" "<<4<<endl;
  outfile<<3<<" "<<1<<" "<<4<<endl;
  cout<<4<<" "<<0<<" "<<4<<endl;
  outfile<<4<<" "<<0<<" "<<4<<endl;
 }
 outfile.close();
}

585 楼

真是好帖子啊,舒服

586 楼

天啊 有没有答案阿  我都做到晕了

587 楼

哦hoho

588 楼

/*68. ( NOI'94.1_4 ) 键盘输入一个高精度的正整数N,去掉其中任意S个数字后
 剩下的数字按原左右次序将组成一个新的正整数。编程对给定的N和S,寻找一种
 方案使得剩下的数字组成的新数最小。输出应包括所去掉的数字的位置和组成的新
 的正整数。(N不超过240位)
 */
#include <iostream>
using namespace std;
#include "string.h"
#include "stdio.h"
#include <iomanip>

int debugging(char s[80],int n)
{for (int i=0;i<n;i++)
      if (s[i]<'0'||s[i]>'9')
          break;
 if (i<n)
     return 1;
 else
     return 0;
}

void sort(int array[],int n)
{int min,max,i,j=0,b[240];
 min=max=array[0];
 for (i=1;i<n;i++)
 {      if (array[i]<min)
          min=array[i];
      if (array[i]>max)
          max=array[i];
}
while (min<=max)
{    for (i=0;i<n;i++)
         if (array[i]==min)
             b[j++]=array[i];
         min++;
}
for (i=0;i<n;i++)
    array[i]=b[i];
}

void assigment(char s[240],int t[240],int l)
{for (int i=0;i<l;i++)
      t[i]=s[i]-'0';
}

void del(int array[240],int n,int num,int *p)
{int k,j,c=0;
    for (int i=0;i<n;i++)
{         if (array[i]==num)
    {         k=i;j=i;
           while (array[j]==array[i])
                 {j++;c++;}
           while (j<n)
                  array[k++]=array[j++];
           n=n-c;
    }
}
         *p=n;
/* for (i=0;i<*p;i++)
      cout<<array[i]<<" ";
      cout<<endl;*/
}

void print(int a[240],int n)
{for (int i=0;i<n;i++)
     cout<<a[i];
     cout<<endl;
}

void min_array(int array[240],int m)
{int i=0,n;
 n=m;
 while (array[i]==0)
        i++;
 if (i!=0&&array[0]==0)
 {int  t=array[i];array[i]=array[0];array[0]=t;}
 cout<<"删除后组成最小的数为:\n";
 print(array,n);
}

void main()
{char ch,str[240];
 int a[240]; 
 int i,len,number,n;
 cout<<"请输入一个整数:\n";
 gets(str);
 len=strlen(str);
 while (debugging(str,len)||len>240)
 {     cout<<"输入数据出错,请重新输入一个整数:\n";
       gets(str);
 }
 assigment(str,a,len);
 cout<<"要删除一个数吗?(Y/N):\n";
 cin>>ch;
 while (ch!='y'&&ch!='n')
 {   cout<<"输入的字母非法,请重新输入y或者是n:\n";
     cin>>ch;
 }
 sort(a,len);
 while (ch=='y')
 {     cout<<"请输入要删除的数:\n";
       cin>>number;
       del(a,len,number,&n);
       cout<<"是否继续删除(Y/N):\n";
       len=n;
       cin>>ch;
 }
 if (len==0)
     cout<<"不能组成最小数字\n";
 else
     min_array(a,len);
}

589 楼

int debugging(char s[80],int n)  
这一行的80要改成240,不然要出错!
我用数组80位做的,题目要求是不超过240位,所以这个地方要改成240

590 楼

不会的时候怎么办   你有答案吗?[em4][em4]

我来回复

您尚未登录,请登录后再回复。点此登录或注册