2017-11-01 5 views
0

두 숫자 사이의 정확한 일치를 찾고 일치하지 않을 때 첫 번째 인스턴스에서 내 카운터를 중지하려고합니다. 그러나 필자가 작성한 코드는 전체 문자열 길이를 계산합니다. 이 작업을 수행 할 수있는 다른 방법이 있습니까? 내 카운터는 소수점 첫째 자리에서 시작되기 때문에 C 프로그래밍 : 두 숫자 사이의 정확한 일치를 결정하는 방법

가 아닌 0, 그것은 15로 계산하지만, 대답을하지 않을 수 있습니다 (10)

#include<stdio.h> 
#include<math.h> 
#include<string.h> 
#include<stdlib.h> 
int main(){  
    char str[100]; 
    char buf[100]; 

    double l,m,a,b; 

    int c,d,t,u,r,q; 
    int count =0; 

    l=59874.141715197809000; 
    m=59874.141715197817000; 

    a= (l - (int)l); 
    b= (m -(int)m); 

    sprintf(str,"%.15f",a); 
    sprintf(buf,"%.15f",b); 

    c = strlen(str); 
    d = strlen(buf); 

    for(t=3;t<c;t++){ 
     for(u=3;u<d;u++){ 
      if(str[t]==buf[u]){ 
       count++; 
       break; 
      } 
     } 
    } 
    printf("matching decimal places = %d \n",count); 
    return 0; 
} 
+0

'의 sprintf (STR %의 .15f "를, A),'하지만이 정수 .. 당신이 견적을 놓치고 .. – Brandon

+0

그리고 당신은 2 개의 루프가 필요 없다. – MFisherKDX

+0

그리고'a = (l - (int) l)'은 항상 여기에서 0이다. –

답변

1

첫 번째로 두 문자열을 비교할 때 두 문자열의 길이가 다른 경우 가장 작은 문자열의 길이로 반복해야합니다. 즉, 문자열에서 순차적 문자 일치의 수를 계산하려는 경우입니다. 예를 들어

:

A = 0.99997552 
B = 0.9999753 

가 .. 당신은 단지 6 개 소수가 일치하는지 결정하기 위해 B의 길이까지 반복 할 것입니다 비교하는 루프 하나 필요합니다. 왜? 여분의 숫자는 B에 존재하지 않으므로 더 이상 진행되지 않으므로 어레이의 끝을 반복하면 어쨌든 정의되지 않은 동작이됩니다.

두 경우 모두 버퍼 길이가 같으므로 걱정하지 않아도되지만 더 짧은 문자열은 긴 문자열에서 찾을 수있는 여분의 숫자가 없습니다. 따라서 가장 작은 길이까지 반복하십시오.

다음과 같은 솔루션을 수행 할 수 있습니다

#include <stdio.h> 
#include <math.h> 
#include <string.h> 
#include <stdlib.h> 

int main() { 

    //Create large enough buffer to hold 100 digits/characters.. 
    char str[100] = {0}; 
    char buf[100] = {0}; 

    //Two doubles to be compared.. 
    double l = 59874.141715197809000; 
    double m = 59874.141715197817000; 

    //Counter keeps track of matching digits.. 
    int count = 0; 

    //Get rid of the base and keep only the decimals.. 
    double a = (l - (int)l); 
    double b = (m - (int)m); 

    //Copy a maximum of 15 decimal places to `str` and `buf` 
    sprintf(str, "%.15f", a); 
    sprintf(buf,"%.15f", b); 

    //Get the length of both strings.. 
    int c = strlen(str); 
    int d = strlen(buf); 

    //If C is smaller, iterate to length(c) else iterate to length(d). 
    for (int i = 2; i < (c < d ? c : d); ++i) 
    { 
     //If the two characters match, increment the count.. 
     if (str[i] == buf[i]) 
     { 
      ++count; 
     } 
    } 

    //Print the amount of matching decimals.. 
    printf("matching decimal places = %d \n", count); 
    return 0; 
} 
+0

그것은 많은 의미가 있습니다. 이전에 삼항 연산자를 사용하는 것을 고려해 보았습니다. 그러나 a와 b를 소수점 이하 15 자리의 문자열로 변환 할 때 개념을 없애 버렸습니다. 당신의 설명과 시간을 가져 주셔서 대단히 감사합니다! – KolacheMaster

+0

@KolacheMaster 여기서 삼항 연산자는 'c'와 'd'의 최소값을 반환하는 데 사용됩니다. – MFisherKDX

+0

@MFisherKDX 삼항 연산자가 어느 문자열 길이가 더 작은 지 반환합니다. 둘 다 같기 때문에 문법적으로 d를 놓은 다음 i KolacheMaster

-1

이에서 정지해야하지만,

if (number1 == number2) 
{ 
// do something to stop it 
} 
+0

나는 그가 10 진수와 일치하는 10 진수의 갯수를 알고 싶어한다고 생각한다. –