たとえば、入力文字列が「00100101」の場合、出力部分文字列は「1001」、「100101」、「101」である必要があります。
機能に間違いがあると思いますが、よくわかりません。2つのエラーが発生しました24行目6列目[エラー]「binarysubstring」のタイプが競合しています4行目6列目[注]「binarysubstring」の以前の宣言はここにありました
#include<stdio.h>
#include<string.h>
long binarysubstring(int, char);
int main()
{
int t,n,count;
long r;
char a[n+1];
t=0;
scanf("%d",&n);
scanf("%s",&a);
r=binarysubstring(n, a[n]);
printf("%ld",r);
}
long binarysubstring(int n,char a[n])
{
int i;
long r;
for(i=0;i<n;i++)
{
if(a[i]==1)
{
r+=1;
}
}
r=((r*(r-1))/2);
return r;
}
ここで処理する間違いは複数あるので、コンパイル時に表示されるエラーから説明して修正しようと思います。
まず、コンパイルエラーは、関数宣言がchar
文字配列ではなく2番目の引数としてを使用するためです。4行目は代わりに
long binarysubstring(int, char[]);
また、18行目の関数シグネチャ内で配列サイズを宣言しないでください。
もう1つの当面の問題は、入力の前にchar a[n+1];
10行目でバッファを初期化して、12行目で定義することです。8行目で宣言されたときに値を定義しなかったため、10行目は実際にはサイズn +1の文字配列を宣言します。 = 0 + 1 = 1、これは入力を保存できません。n
n
これら3つの問題を修正して、次のコードをClang-7でコンパイルしました。
#include<stdio.h>
#include<string.h>
long binarysubstring(int, char[]); // Added the brackets here
int main()
{
int t,n,count;
long r;
t=0;
scanf("%d",&n); // Moved this...
char a[n+1]; // ...to be before this
scanf("%s", a);
r=binarysubstring(n, a);
printf("%ld",r);
}
long binarysubstring(int n, char a[/*Removed n, do not pass anything here*/])
{
int i;
long r;
for(i=0;i<n;i++)
{
if(a[i]==1)
{
r+=1;
}
}
r=((r*(r-1))/2);
return r;
}
ただし、このコードは常に0を返します。これは、24行目でifステートメントがそれぞれchar
を整数と比較し、整数が1の実際の文字ではないASCIIコードに解析されるためです。その結果、r
条件が真になることはないため、インクリメントされることはありません。入力しているバイナリ文字列を使用すると、最終的な合計式まで0のままになり、最終的な合計式も0と評価されます。
この時点で、私はあなたの質問が尋ねるものを実装するための私の試みをします:
#include <stdio.h>
long binarysubstring(unsigned short, char[]);
int main() {
unsigned short n;
printf("Input the length of your string: ");
scanf("%hu", &n);
char input[n + 1];
printf("Input the binary string: ");
scanf("%s", input);
long answer = binarysubstring(n, input);
printf("Answer: %ld\n", answer);
}
long binarysubstring(unsigned short n, char a[]) {
long r = 0;
for (unsigned short i = 0; i < n; ++i) {
if (a[i] == '1') {
++r;
}
}
return r*(r-1)/2;
}
これは、入力がバイナリ文字列であることを前提としています。私はあなたが見ているのと同じアルゴリズムを使用し、文字列に1が現れる回数を数え、r
1からまでのシーケンスの整数の合計を返しr
ます。また、長さが1のバイナリ文字列の場合は0を返します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加