编程基础有点差,通过可追加酬金

C语言 C++

img

img


求帮助一下,最近太忙了来不及完成,这块学的有点差, 万分感谢
我们的oj用不了gets函数
一共2道题

解答如下
1.

img


2.

img

1.

#include <stdio.h>
#define n 255
int main()
{
    int flag=0;
    char t[n][n]={' '};
    int a=n,b,d;
    char c;
    do
    {
        scanf("%d",&a);
        if(a==0) break;
        scanf("%d %c %d",&b,&c,&d);
        printf("%d %d %c %d\n",a,b,c,d);
        for(int i=0;i<a ;i++ )
        {
            for(int j=0;j<b ;j++ )
            {
                t[i][j]=c;
            }
        }
        if(!d)
        {
            for(int i=1;i<a-1 ;i++ )
            {
                for(int j=1;j<b-1 ;j++ )
                {
                    t[i][j]=' ';
                }
            }
        }
        for(int i=0;i<a ;i++ )
        {
            for(int j=0;j<b ;j++ )
            {
                printf("%c",t[i][j]);
            }
            printf("\n");
        }
    }while(a!=0);

    return 0;
}

2.

#include <stdio.h>
#include <string.h>
void addBinary(char * a, char * b, char * c)
{
    int len1 = strlen(a), len2 = strlen(b), carry = 0, k = 0;
    int i, j;
    char cc;
    int x, y, sum;

    //核心代码,从右往左进行运算
    for (i = len1 - 1, j = len2 - 1; i >= 0 || j >= 0 || carry; --i, --j){
        //很可能有a, b数组长等的时候,所以会有i, j小于0的情况,这时直接把该位置为0即可
        x = i < 0 ? 0 : a[i] - '0';
        y = j < 0 ? 0 : b[j] - '0';
        sum = (x + y + carry) % 2; //存入数组中的值
        carry = (x + y + carry) / 2; //进位
        c[k++] = sum + '0';
    }
    c[k] = '\0'; //结束字符
    //翻转字符串
    for (i = 0, j = k - 1; i < j; i++, j--)
    {
        cc = c[i];
        c[i] = c[j];
        c[j] = cc;
    }
}

int main()
{
    int n;
    scanf("%d",&n);
    while(n--)
    {
        char a[255];
        char b[255];
        char c[255];
        fflush(stdin);
        scanf("%s",a);
        fflush(stdin);
        scanf("%s",b);
        addBinary(a,b,c);
        printf("%s\n",c);
    } 
    return 0;
}

第一题

#include <stdio.h>

int main()
{
    int h,w,n,i,j;
    char ch[2];
    while(1) {
        scanf("%d", &h);
        if(h == 0) {
            break;
        }
        scanf("%d", &w);
        scanf("%s", ch);
        scanf("%d", &n);
        for(i=0; i<h; i++) {
            for(j=0; j<w; j++) {
                if(i==0 || i==h-1) {
                    printf("%c", ch[0]);
                }
                else {
                    if(n == 0) {
                        if(j==0 || j==w-1) {
                            printf("%c", ch[0]);
                        }
                        else {
                            printf(" ");
                        }
                    }
                    else {
                        printf("%c", ch[0]);
                    }
                }
            }
            printf("\n");
        }
    }
    return 0;
}

第二题

#include <stdio.h>

int main()
{
    char a[101], b[101];
    int count, c, m, n, i, j, k;
    scanf("%d", &count);
    for(c=0; c<count; c++) {
        scanf("%s", a);
        scanf("%s", b);
        m = strlen(a);
        k = n = strlen(b);
        if(m > k) {
            k = m;
        }
        a[k+1] = 0;
        for(i=0; i<k; i++) {
            a[k-i] = a[m-i-1];
        }
        for(i=0; i<=k-m; i++) {
            a[i] = '0';
        }
        for(i=0; i<=k; i++) {
            b[k-i] = b[n-i-1];
        }
        for(i=0; i<=k-n; i++) {
            b[i] = '0';
        }
        j=0;
        for(i=0; i<k; i++) {
            j = (a[k-i] + b[k-i] + j - 96);
            a[k-i] = j % 2 + 48;
            j = j / 2;
        }
        a[0] = j + 48;
        if(a[0] == '0') {
            printf("%s\n", a+1);
        }
        else {
            printf("%s\n", a);
        }
    }
    return 0;
}

第二小题:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
void add(char s1[],char s2[]){
    int k[100];//存放计算后的二进制数
    
    int sum,sum1=0,sum2=0;
    int len1,len2;//两个字符数组的长度
    int i=0;
    len1 = strlen(s1);
    len2 = strlen(s2);
    while(s1[i]!='\0')//第一个二进制数转化为十进制数
    {
        sum1+= pow(2,len1-1)*(s1[i]-48);
        len1--;
        i++;
    }
    i=0;
    while(s2[i]!='\0')//第二个二进制数转化为十进制数
    {
        sum2+= pow(2,len2-1)*(s2[i]-48);
        len2--;
        i++;
    }
    i=0;
    sum = sum1+sum2;//两数和
    while(sum)//和转化为二进制
    {
        k[i] = sum%2;
        sum/=2;
        i++;
    }
    i=i-1;
    while(i>=0)//输出
    {
        printf("%d",k[i]);
        i--;
    }
}
int main()
{
    char s1[100][100],s2[100][100];//输入的两个二进制数
    int n,i;
    scanf("%d",&n);
    for(i=0;i<n;i++){
       scanf("%s",s1[i]);
       scanf("%s",s2[i]);
    }
    for(i=0;i<n;i++){
      add(s1[i],s2[i]);
      printf("\n");
    }
    return 0;
}

img

第一题:

#include<iostream>
using namespace std;
int main()
{   
    int a,b,d;
    char c;
    
    while(1)
    {
        cin>>a;
        if(a==0)
        {
            break;
        }        
        cin>>b>>c>>d;

        if(d==0) //空心
        {
            for(int i=1;i<=a;i++) //判断行数
            {
                for(int j=1;j<=b;j++) //判断列数
                {
                    if(i==1 || i==a) //如果是上下边界,就输满
                        cout<<c;
                    else
                    {
                        if(j==1 || j==b) //如果是左右边界,输一个
                            cout<<c;
                        else //否则输出空格
                            cout<<" ";
                    }
                } 
                cout<<endl; //换行 
            }
        }
        else //实心
        {
            for(int i=1;i<=a;i++) //行数
            {
                for(int j=1;j<=b;j++) //列数
                    cout<<c; //一直输出
                cout<<endl; //换行
            }
        }
        
    }
    
    return 0; 
}    

第二题:
第二题,借助字符数组进行处理,借助字符数组存储二进制数,再将二进制数转化为十进制数,最后将十进制的数求和,之后再转化为二进制就可以了。

如有帮助,还请采纳!谢谢!

第一题

#include<stdio.h>
 
int main(){
    int a,b,d;
    char c;
    int i,r;
    scanf("%d %d %c %d",&a,&b,&c,&d);
    if(d){           //如果d==1,则每行输出b个字符即可
    for(i=1;i<=a;i++){
        for(r=1;r<=b;r++){
            printf("%c",c);
        }
        printf("\n");
    }
    }
    else {              //d==0,画实心
    for(i=1;i<=a;i++){
        for(r=1;r<=b;r++){
            if(r==1||r==b||i==1||i==a) printf("%c",c);   //横竖等于1的时候输出字符c
            else printf("%c",' ');             //否则输出空格
            } 
        printf("\n");
        }
    }
    return 0;
}

求一下第二题

看他们都解决了,我就不写了。加油